Autor Zpráva
sysel
Profil
Program na analysy mně vytváří reporty ve formě XML zhruba následující struktury:

<dlouha>
  <cesta>
    <zaznam>
      <polozka1>hodnota1</polozka1>
      <polozka2>
          <podpolozka>podhodnota</podpolozka>
      </polozka2>
      <polozka3>hodnota3</polozka3>
      <polozka4>hodnota4</polozka4>
      <polozka5>hodnota5</polozka5>
      <polozka6>hodnota6</polozka6>
      <polozka7>hodnota7</polozka7>
    </zaznam>
    <zaznam>
      <polozka1>hodnota1</polozka1>
      <polozka2>
          <podpolozka>podhodnota</podpolozka>
      </polozka2>
      <polozka3>hodnota3</polozka3>
      <polozka4>hodnota4</polozka4>
      <polozka6>hodnota6</polozka6>
    </zaznam>
    <zaznam>
      <polozka1>hodnota1</polozka1>
      <polozka2>
          <podpolozka>podhodnota</podpolozka>
      </polozka2>
      <polozka4>hodnota4</polozka4>
      <polozka5>hodnota5</polozka5>
      <polozka6>hodnota6</polozka6>
    </zaznam>
  </cesta>
</dlouha>

Tyto obsáhlé dokumenty pracně transformuji do postgresové tabulky

CREATE TABLE tabulka 
(ID              SERIAL
,polozka1        CHAR(3)
,polozka2podpol  Varchar(255)
,polozka3        Decimal(15,2)
,polozka4        TimeStamp
,polozka5        Varchar(255)
,polozka6        Decimal(15,2)
,polozka7        TimeStamp
)

v databázi k dalšímu zpracování;

Potřeuji tedy přenést do psql tabulky výše uvedenou XML strukturu.
Progooglil jsem již hodně hodin, ale našel jsem zatím pouze samotné XML parsery ( xmlstarlet ) nebo definice vnitřních funkcí v postgresu založené na pg_read_file() funkci, leč bez výkladu, jak se má s načtenými daty dále zacházet.
Zatím jsem provisorně spáchal bashový skript, který XML záznamy po jednom převádí do standardního příkazu:

INSERT INTO tabulka (polozka1,polozka2podpol,polozka3,polozka4,polozka5,polozka6,polozka7) 
VALUES ('hodnota1','podhodnota',hodnota3,hodnota4,hodnota5,hodnota6,hodnota7);

jednotlivě proto, že záznamy nemají vždy plný počet položek, a tak musím upravovat každý vstup individuálně.
Postup je však neobyčejně pomalý a věc se dále komplikuje, protože hodnoty mohou nezodpovědně obsahovat řídící znaky (například '), které je třeba identifikovat a řešit.

Takže bych uvítal nějaký inteligentní parser -jedno-li na straně serveru formou funkce, či klienta- který by insert provedl třebas podle nějakého vzoru, ale hlavně věcně správně, rychle a bez zahlcení věším vstupním souborem (není neobvyklý počet kolem milionu záznamů, čili kolem 300 mil znaků)

Víte někdo o takovém, již hotovém? případně o funkcích pg_... , které by něco užitečného provedly, pokud bych jim celý soubor bashem rozsplitoval po jednotlivých XML záznamech?

Díky za každý nápad i za informaci, že hledám zbytečně
ttttt
Profil *
Můžeš zkusit xmltable, nevím, jak je to rychlé. Jinak ta data převeď do CSV a naimportuj to pomocí COPY, bude to rychlejší než inserty. Na převod doporučuju nějaký XML parser a ne bash.
sysel
Profil
ttttt:
Děkuji za skvělý tip ( COPY ). Trochu mi trvalo vše připravit, ale funguje to nadočekávání dobře - rychlé, spolehlivé a nemusím vstupní soubory splitovat po 100 řádcích, klidně to polkne i 300 tisíc řádek v celku. COPY má možnost pro vstupní CSV přizpůsobit separátor i druh uvozovek pro textové řetězce. Mohu tento postup doporučit. Jediné úskalí může být pro uživatele bez administrátorských práv požadavek na lokální umístění vstupního souboru na serveru, kde běží postgresql. Naštěstí jsem správcem tohoto severu, ale mylslím, že by neměl být problém se s administrátorem dohodnout a soubor na server nahrát.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0