SQL - import csv, rozparsování a vložení do tabulky

John

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.

« Poslední změna: 08. 07. 2016, 00:03:58 od Petr Krčmář »


lanyz

Re:SQL - import csv, rozparsovani a vložení do tabulky
« Odpověď #1 kdy: 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.

John

Re:SQL - import csv, rozparsovani a vložení do tabulky
« Odpověď #2 kdy: 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.


Ivan Nový

Re:SQL - import csv, rozparsovani a vložení do tabulky
« Odpověď #3 kdy: 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

Ivan Nový

Re:SQL - import csv, rozparsovani a vložení do tabulky
« Odpověď #4 kdy: 07. 07. 2016, 10:54:50 »


lanyz

Re:SQL - import csv, rozparsovani a vložení do tabulky
« Odpověď #5 kdy: 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.

John

Re:SQL - import csv, rozparsovani a vložení do tabulky
« Odpověď #6 kdy: 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).

Ivan Nový

Re:SQL - import csv, rozparsovani a vložení do tabulky
« Odpověď #7 kdy: 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.

bacil

Re:SQL - import csv, rozparsovani a vložení do tabulky
« Odpověď #8 kdy: 07. 07. 2016, 16:54:37 »
robit toto v SQL je ciste ZLO!

Ivan Nový

Re:SQL - import csv, rozparsovani a vložení do tabulky
« Odpověď #9 kdy: 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).

bacil

Re:SQL - import csv, rozparsovani a vložení do tabulky
« Odpověď #10 kdy: 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

gl

Re:SQL - import csv, rozparsovani a vložení do tabulky
« Odpověď #11 kdy: 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.

PepaN

Re:SQL - import csv, rozparsovani a vložení do tabulky
« Odpověď #12 kdy: 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...

John

Re:SQL - import csv, rozparsování a vložení do tabulky
« Odpověď #13 kdy: 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.

Re:SQL - import csv, rozparsovani a vložení do tabulky
« Odpověď #14 kdy: 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.