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.

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