Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: John 07. 07. 2016, 09:19:41

Název: SQL - import csv, rozparsování a vložení do tabulky
Přispěvatel: John 07. 07. 2016, 09:19:41
Dobrý den všem,
už jednou jste mi zde moc pomohli, tak se na Vás opět obracím s problémem. Mám problém s vyřešením jednoho prac. úkolu. Díky tomu, že se v tom nepohybuji a je to jen jednorázový úkol, který je potřeba v brzkém čase vyřešit, tak se obracím na Vás.
Jedná se o toto: 1.: Vytvořit web. službu (proceduru), která dovolí nahrát soubor ve formátu .csv. („připravené“) 2.: Dále vytvořit další (navazující) proceduru, která po nahrání daného .csv, toto csv rozparsuje (vždy stejná struktura) a vloží do připravené tabulky na serveru. Věřím, že se pro se bude jednat o banalitu. Bohužel se teprve rozkoukávám a rychlé splnění je nutné. Předem Vám děkuji za případnou pomoc. Jedná se mi hlavně o to rozparsování.

1.:
procedure upload_csv is
    begin
      htp.htmlOpen;
      htp.headOpen; 
      htp.p('<meta charset="UTF-8">');
      htp.title('Odeslání souboru');
      htp.headClose;
      htp.bodyOpen;
      htp.p('<FORM ACTION="test.zpracuj_upload_csv" METHOD="post" ENCTYPE="multipart/form-data">');
      htp.p('<INPUT TYPE="file" NAME="soubor" SIZE="50">');
      htp.p('<INPUT TYPE="submit" VALUE="Ulož">');
      htp.p('</FORM>');
      htp.bodyClose;
      htp.htmlClose;
    end;

2.: Zde jsem ztracen a nevím, jak tuto proceduru uchopit... Našel jsem si např. toto: https://slobaray.com/2014/05/28/loading-csv-files-into-oracle-tables-using-plsql/ , ale o moc moudřejší nejsem.

Struktura .csv, vždy bude: ID (varchar2 – díky číselné řadě a písmennému označení); DatumPočátku (date – zde by měla být i kontrola na validnost data); DatumKonce (date) – data prozatím null * možná se ani vyplňovat nebudou; DatumVložení (date – aktuální datum); Poznámka (varchar2). Vše odděleno „;“

Bohužel nemohu použít žádné jiné jazyky (ruby, python, java,...) a dané csv musí být rozparsováno přímo v proceduře (pl/sql).
Nemohl by někdo napsat nějaký mustr, či na něj poslat odkaz, abych se ho mohl chytit?
Ještě jednou děkuji za případnou pomoc.

Název: Re:SQL - import csv, rozparsovani a vložení do tabulky
Přispěvatel: lanyz 07. 07. 2016, 09:28:04
Neuvedl jsi, v cem je problem (umis plsql, neumis plsql?), jake jsou naroky na vykon apod. trivialni postup je parsovat vstup podle oddelovacu (instr, substr), tim ziskat radky a na nich jednotlive sloupce, ty validovat a ukladat do databaze.
Název: Re:SQL - import csv, rozparsovani a vložení do tabulky
Přispěvatel: John 07. 07. 2016, 09:37:04
To lanyz: Přiznám se, bohužel s PL/SQL ještě neumím. Chtěl a měl bych se naučit, ale toto je na mě v tuto chvíli asi moc.
Nároky na výkon prozatím neřešíme. Jedná se o jednorázové nahrávání csv souboru jednou za čas.

Název: Re:SQL - import csv, rozparsovani a vložení do tabulky
Přispěvatel: Ivan Nový 07. 07. 2016, 09:52:47
Dobrý den všem,
už jednou jste mi zde moc pomohli, tak se na Vás opět obracím s problémem. Mám problém s vyřešením jednoho prac. úkolu. Díky tomu, že se v tom nepohybuji a je to jen jednorázový úkol, který je potřeba v brzkém čase vyřešit, tak se obracím na Vás.
Jedná se o toto: 1.: Vytvořit web. službu (proceduru), která dovolí nahrát soubor ve formátu .csv. („připravené“) 2.: Dále vytvořit další (navazující) proceduru, která po nahrání daného .csv, toto csv rozparsuje (vždy stejná struktura) a vloží do připravené tabulky na serveru. Věřím, že se pro se bude jednat o banalitu. Bohužel se teprve rozkoukávám a rychlé splnění je nutné. Předem Vám děkuji za případnou pomoc. Jedná se mi hlavně o to rozparsování.

1.:
procedure upload_csv is
    begin
      htp.htmlOpen;
      htp.headOpen; 
      htp.p('<meta charset="UTF-8">');
      htp.title('Odeslání souboru');
      htp.headClose;
      htp.bodyOpen;
      htp.p('<FORM ACTION="test.zpracuj_upload_csv" METHOD="post" ENCTYPE="multipart/form-data">');
      htp.p('<INPUT TYPE="file" NAME="soubor" SIZE="50">');
      htp.p('<INPUT TYPE="submit" VALUE="Ulož">');
      htp.p('</FORM>');
      htp.bodyClose;
      htp.htmlClose;
    end;

2.: Zde jsem ztracen a nevím, jak tuto proceduru uchopit... Našel jsem si např. toto: https://slobaray.com/2014/05/28/loading-csv-files-into-oracle-tables-using-plsql/ , ale o moc moudřejší nejsem.

Struktura .csv, vždy bude: ID (varchar2 – díky číselné řadě a písmennému označení); DatumPočátku (date – zde by měla být i kontrola na validnost data); DatumKonce (date) – data prozatím null * možná se ani vyplňovat nebudou; DatumVložení (date – aktuální datum); Poznámka (varchar2). Vše odděleno „;“

Bohužel nemohu použít žádné jiné jazyky (ruby, python, java,...) a dané csv musí být rozparsováno přímo v proceduře (pl/sql).
Nemohl by někdo napsat nějaký mustr, či na něj poslat odkaz, abych se ho mohl chytit?
Ještě jednou děkuji za případnou pomoc.

Oracle má externí tabulky použijet něco takového
Kód: [Vybrat]
CREATE TABLE roster_data (
  student_no CHAR(5),
  name CHAR(20),
  grade CHAR(2))
  ORGANIZATION EXTERNAL (TYPE ORACLE_LOADER DEFAULT DIRECTORY ext_tab_dir
                         ACCESS PARAMETERS (FIELDS TERMINATED BY ',')
                         LOCATION ('info.dat'));

a v dokumentaci k db heldejte heslo EXTERNAL_TBL
Název: Re:SQL - import csv, rozparsovani a vložení do tabulky
Přispěvatel: Ivan Nový 07. 07. 2016, 10:54:50
A zde podrobněji rozepsané https://oracle-base.com/articles/9i/external-tables-9i
Název: Re:SQL - import csv, rozparsovani a vložení do tabulky
Přispěvatel: lanyz 07. 07. 2016, 12:51:51
To lanyz: Přiznám se, bohužel s PL/SQL ještě neumím. Chtěl a měl bych se naučit, ale toto je na mě v tuto chvíli asi moc.
Nároky na výkon prozatím neřešíme. Jedná se o jednorázové nahrávání csv souboru jednou za čas.

Tak to je trochu blocker pokud plati podminka, ze to musi byt v PL/SQL, To se asi budes muset zaklady naucit. Pokud to nemusi byt v PL/SQL, tak je samozrejme spousta jinych metod, na "jednorázové nahrávání csv souboru jednou za čas" bych pouzil sqlloader, ale zalezi na tom, jestli to musi bezet na webu, co se kde muze nainstalovat, jak se maji resit pripadne chyby v datech atd.
Název: Re:SQL - import csv, rozparsovani a vložení do tabulky
Přispěvatel: John 07. 07. 2016, 14:03:11
To Ivan Nový: Děkuji, mrknu na to, jestli je to vhodné pro naše řešení.
To lanyz: Úplné základy trochu zvládám, ale toto spojování procedur ještě ne. Požadavek je opravdu jen PL/SQL, bez možnosti instalace dalších rozšíření DB. "sqlloader" běžně využívám, ale toto má být webová aplikace přístupná běžným zaměstnancům (ne mně), do které se např.: 1x za měsíc nahraje dané csv a dále jak jsem popisoval (automat. rozparsování a vložení do připravené tabulky).
Název: Re:SQL - import csv, rozparsovani a vložení do tabulky
Přispěvatel: Ivan Nový 07. 07. 2016, 14:46:02
To Ivan Nový: Děkuji, mrknu na to, jestli je to vhodné pro naše řešení.
To lanyz: Úplné základy trochu zvládám, ale toto spojování procedur ještě ne. Požadavek je opravdu jen PL/SQL, bez možnosti instalace dalších rozšíření DB. "sqlloader" běžně využívám, ale toto má být webová aplikace přístupná běžným zaměstnancům (ne mně), do které se např.: 1x za měsíc nahraje dané csv a dále jak jsem popisoval (automat. rozparsování a vložení do připravené tabulky).
Mělo by to fungovat tak, že soubor nahrajete do určeného adresáře, a tím se automaticky stane čitelným přes onu vytvořenou tabulku.
Název: Re:SQL - import csv, rozparsovani a vložení do tabulky
Přispěvatel: bacil 07. 07. 2016, 16:54:37
robit toto v SQL je ciste ZLO!
Název: Re:SQL - import csv, rozparsovani a vložení do tabulky
Přispěvatel: Ivan Nový 07. 07. 2016, 17:14:25
robit toto v SQL je ciste ZLO!
Máte-li ale rozsáhlý soubor dat, tak načíst to k tomu určeným SQL příkazem do databáze je často jediná schůdná cesta (MySQL LOAD DATA, Postgress COPY, Oracle EXTERNAL_TBL).
Název: Re:SQL - import csv, rozparsovani a vložení do tabulky
Přispěvatel: bacil 07. 07. 2016, 19:28:07
robit toto v SQL je ciste ZLO!
Máte-li ale rozsáhlý soubor dat, tak načíst to k tomu určeným SQL příkazem do databáze je často jediná schůdná cesta (MySQL LOAD DATA, Postgress COPY, Oracle EXTERNAL_TBL).

predpokladam ze ked tam chce nieco nahravat cez web, tak to nebudu 500MB CSV.

a ked uz nieco ladujem do DB, tak si chcem osetrit data uz na vstupe a nie cakat na DB error.
Bulk insertom sa daju veci celkom rychlo naladovat ak sa bavime aj o 10k+ riadkoch
Název: Re:SQL - import csv, rozparsovani a vložení do tabulky
Přispěvatel: gl 07. 07. 2016, 19:36:07
robit toto v SQL je ciste ZLO!
Máte-li ale rozsáhlý soubor dat, tak načíst to k tomu určeným SQL příkazem do databáze je často jediná schůdná cesta (MySQL LOAD DATA, Postgress COPY, Oracle EXTERNAL_TBL).

predpokladam ze ked tam chce nieco nahravat cez web, tak to nebudu 500MB CSV.

a ked uz nieco ladujem do DB, tak si chcem osetrit data uz na vstupe a nie cakat na DB error.
Bulk insertom sa daju veci celkom rychlo naladovat ak sa bavime aj o 10k+ riadkoch

Ten soubor si vygenerujete z ošetřených dat.
Název: Re:SQL - import csv, rozparsovani a vložení do tabulky
Přispěvatel: PepaN 07. 07. 2016, 19:44:24
Hmm, nevidím v tom žádný problém v prostředí, které znám (mysql, mssql, php).
Řešení 1. webový formulář, natažení csv, skript v PHP rozparseruje, zpracuje a uloží do databáze.
Řešení 2. pokud to má fungovat automatizovaně, tak vyloučit lidský faktor, což je u csv exportů běžnější.

Tady spíš cítím, že byl zadavateli slíben rozsah schopností a znalostí, které nejsou realitou... Snad se dílo zdaří, ale je to dost hazard do toho jít s těmito výchozími podmínkami...
Název: Re:SQL - import csv, rozparsování a vložení do tabulky
Přispěvatel: John 08. 07. 2016, 09:37:49
To Ivan Nový, bacil, gl: Děkuju za názory.
To PepaN: Také děkuji za názor. Nikomu jsem nic nesliboval. Pracoval jsem na jiné práci a toto byl pouze požadavek, jestli bych to nemohl zkusit vyřešit. Řekl jsem, že to zkusím, ale že nic neslibuji.

Lidský faktor tam musí být pouze při nahrávání, zbytek by se mělo obstarat samo.
Název: Re:SQL - import csv, rozparsovani a vložení do tabulky
Přispěvatel: Zdenek Henek 08. 07. 2016, 09:56:53
Dobrý den všem,
už jednou jste mi zde moc pomohli, tak se na Vás opět obracím s problémem. Mám problém s vyřešením jednoho prac. úkolu. Díky tomu, že se v tom nepohybuji a je to jen jednorázový úkol, který je potřeba v brzkém čase vyřešit, tak se obracím na Vás.
Jedná se o toto: 1.: Vytvořit web. službu (proceduru), která dovolí nahrát soubor ve formátu .csv. („připravené“) 2.: Dále vytvořit další (navazující) proceduru, která po nahrání daného .csv, toto csv rozparsuje (vždy stejná struktura) a vloží do připravené tabulky na serveru. Věřím, že se pro se bude jednat o banalitu. Bohužel se teprve rozkoukávám a rychlé splnění je nutné. Předem Vám děkuji za případnou pomoc. Jedná se mi hlavně o to rozparsování.

1.:
procedure upload_csv is
    begin
      htp.htmlOpen;
      htp.headOpen; 
      htp.p('<meta charset="UTF-8">');
      htp.title('Odeslání souboru');
      htp.headClose;
      htp.bodyOpen;
      htp.p('<FORM ACTION="test.zpracuj_upload_csv" METHOD="post" ENCTYPE="multipart/form-data">');
      htp.p('<INPUT TYPE="file" NAME="soubor" SIZE="50">');
      htp.p('<INPUT TYPE="submit" VALUE="Ulož">');
      htp.p('</FORM>');
      htp.bodyClose;
      htp.htmlClose;
    end;

2.: Zde jsem ztracen a nevím, jak tuto proceduru uchopit... Našel jsem si např. toto: https://slobaray.com/2014/05/28/loading-csv-files-into-oracle-tables-using-plsql/ , ale o moc moudřejší nejsem.

Struktura .csv, vždy bude: ID (varchar2 – díky číselné řadě a písmennému označení); DatumPočátku (date – zde by měla být i kontrola na validnost data); DatumKonce (date) – data prozatím null * možná se ani vyplňovat nebudou; DatumVložení (date – aktuální datum); Poznámka (varchar2). Vše odděleno „;“

Bohužel nemohu použít žádné jiné jazyky (ruby, python, java,...) a dané csv musí být rozparsováno přímo v proceduře (pl/sql).
Nemohl by někdo napsat nějaký mustr, či na něj poslat odkaz, abych se ho mohl chytit?
Ještě jednou děkuji za případnou pomoc.

Oracle má externí tabulky použijet něco takového
Kód: [Vybrat]
CREATE TABLE roster_data (
  student_no CHAR(5),
  name CHAR(20),
  grade CHAR(2))
  ORGANIZATION EXTERNAL (TYPE ORACLE_LOADER DEFAULT DIRECTORY ext_tab_dir
                         ACCESS PARAMETERS (FIELDS TERMINATED BY ',')
                         LOCATION ('info.dat'));

a v dokumentaci k db heldejte heslo EXTERNAL_TBL

csv umi i carky ktere jsou soucasti bunky, ne oddelovace viz. https://cs.wikipedia.org/wiki/CSV

ujiste te se, ze tam nic takoveho neni, jinak ten radek bude rozhozeny

pokud to je politicky pruchozi (dokazu si predstavit, ze nemusi byt), tak k pl/sql pridejte i jiny jazyk (groovy, python, ...) tam uz byste mohl pouzit knihovny, ktere parsovani csv souboru resi a nemusite se starat o carky uprostred bunky.
Název: Re:SQL - import csv, rozparsování a vložení do tabulky
Přispěvatel: John 15. 08. 2016, 11:12:30
Dobrý den všem.
Po nějaké době, kdy byl čas na "důležitější" věci, se opět vracím k tomuto tématu. Opravu děkuji všem za rady/podněty, které jsem si prošel a zkonzultoval. Ale přesto bych se na Vás ještě jednou obrátil, jestli byste mi nedokázali pomoci.
Když se lehce vrátím, tak:
"EXTERNAL TABLES" by mohlo být jedno z řešení, jen kdyby byl přístupný filesystém, což bohužel není. Co jsem ale naopak zjistil, tak je možné využít JavaScript.
Tzn. možné řešení jsou pomocí:
-PL/SQL;
-JavaScriptu.
A v čem mám tedy problém? Nalezeným řešeným příkladům jakž takž rozumím. První část bych také měl připravenou, ale propojit ji s druhou, ke které sice příklady jsou, ale řeší jen možnost uploadu souboru přímo z PC, neřeší možnost propojení z web službou.
Pro zopakování se mi jedná o (z pohledu uživatele): "Na stránce kliknu a vyberu CSV soubor a odešlu ho ke zpracování (viz. 1. procedura) - 2. procedura soubor automaticky převezme a rozparsuje do předem dané tabulky - uživatel vidí svá data v DB."
Pokud by byl někdo schopen/ochoten pomoc, tak bych byl moc vděčný. Děkuji.
S pozdravem
John
Název: Re:SQL - import csv, rozparsování a vložení do tabulky
Přispěvatel: John 15. 08. 2016, 12:22:09
!OPRAVA!
Je možné použít Javu.

Dobrý den všem.
Po nějaké době, kdy byl čas na "důležitější" věci, se opět vracím k tomuto tématu. Opravu děkuji všem za rady/podněty, které jsem si prošel a zkonzultoval. Ale přesto bych se na Vás ještě jednou obrátil, jestli byste mi nedokázali pomoci.
Když se lehce vrátím, tak:
"EXTERNAL TABLES" by mohlo být jedno z řešení, jen kdyby byl přístupný filesystém, což bohužel není. Co jsem ale naopak zjistil, tak je možné využít JavaScript.
Tzn. možné řešení jsou pomocí:
-PL/SQL;
-JavaScriptu.
A v čem mám tedy problém? Nalezeným řešeným příkladům jakž takž rozumím. První část bych také měl připravenou, ale propojit ji s druhou, ke které sice příklady jsou, ale řeší jen možnost uploadu souboru přímo z PC, neřeší možnost propojení z web službou.
Pro zopakování se mi jedná o (z pohledu uživatele): "Na stránce kliknu a vyberu CSV soubor a odešlu ho ke zpracování (viz. 1. procedura) - 2. procedura soubor automaticky převezme a rozparsuje do předem dané tabulky - uživatel vidí svá data v DB."
Pokud by byl někdo schopen/ochoten pomoc, tak bych byl moc vděčný. Děkuji.
S pozdravem
John
Název: Re:SQL - import csv, rozparsování a vložení do tabulky
Přispěvatel: Michal Kovačič 15. 08. 2016, 16:37:37
Jak koukám, je to pracovní úkol - takže bych čekal, že společnost se plácne přes kapsu a poskytne něco málo financí na konzultace nebo něco více financí na napsání udělátka nebo celou hromadu na naplacení zahraniční konzultační firmy pro projekt na 6 měsíců...

Není něco z toho cesta?
Název: Re:SQL - import csv, rozparsování a vložení do tabulky
Přispěvatel: lanyz 15. 08. 2016, 16:50:59
!OPRAVA!
Je možné použít Javu.

A opet se tu vnucuje otazka - umis Javu? Asi neprekvapi, ze odpoved je docela zasadni z hlediska dalsiho postupu, respektive moznosti profitovat z teto nove informace.
Název: Re:SQL - import csv, rozparsování a vložení do tabulky
Přispěvatel: Ivan Nový 15. 08. 2016, 17:04:59
Dobrý den všem.
Po nějaké době, kdy byl čas na "důležitější" věci, se opět vracím k tomuto tématu. Opravu děkuji všem za rady/podněty, které jsem si prošel a zkonzultoval. Ale přesto bych se na Vás ještě jednou obrátil, jestli byste mi nedokázali pomoci.
Když se lehce vrátím, tak:
"EXTERNAL TABLES" by mohlo být jedno z řešení, jen kdyby byl přístupný filesystém, což bohužel není. Co jsem ale naopak zjistil, tak je možné využít JavaScript.
Tzn. možné řešení jsou pomocí:
-PL/SQL;
-JavaScriptu.
A v čem mám tedy problém? Nalezeným řešeným příkladům jakž takž rozumím. První část bych také měl připravenou, ale propojit ji s druhou, ke které sice příklady jsou, ale řeší jen možnost uploadu souboru přímo z PC, neřeší možnost propojení z web službou.
Pro zopakování se mi jedná o (z pohledu uživatele): "Na stránce kliknu a vyberu CSV soubor a odešlu ho ke zpracování (viz. 1. procedura) - 2. procedura soubor automaticky převezme a rozparsuje do předem dané tabulky - uživatel vidí svá data v DB."
Pokud by byl někdo schopen/ochoten pomoc, tak bych byl moc vděčný. Děkuji.
S pozdravem
John
Nápověda zde https://oracle-base.com/articles/misc/xml-over-http, je to pro xml, ale v csv je to o to jednodušší.a zajímavé je taky toto https://github.com/mortenbra/alexandria-plsql-utils