Jak převést rozsáhlý *xml soubor do čitelnější formy?
Pro své potřeby dokážu z rozsáhlých tabulek v Excelu vytvořit požadované *xml soubory, třeba pro odesílání na úřady (typicky kontrolní hlášení k DPH).
Zajímal by mě opačný postup, tak dostat data z hotového *xml třeba do Excelu, případně databáze. K jednotlivým *xml souborům existuje i *xsd schéma. Netuším jak (jednoduše) na to, zda je nějaká možnost, jak data z toho vydolovat třeba přímo v Excelu - či je nutné použít jiný (programátorský?) postup. Respektive přesněji: vůbec tomu nerozumím.
Ta data jsou teď poněkud výbušné zboží (náhle se probudili rádoby bojovníci za GDPR, přitom VŠECHNY tyto údaje může KDOKOLIV získat - byť méně pohodlně - už řadu let), vše je k mání tady: https://www.mojedatovaschranka.cz/sds/welcome?part=opendata
Tak jsem zkusil ten nejmenší soubor naimportovat do Excelu (2007), menu Data - Načíst externí data - Z jiných zdrojů, po pár minutách hotovo, uloženo jako *xlsx, opravdu pěkná tabulka.
Zkusil jsem stejný postup na další, půlgigový soubor, běží to (kolečko se točí) už dobře 20 minut, zatím nic. Nechám to klidně běžet hodinu, dvě, ale trochu se obávám, že to tenhle Excel nezvládne. Na PC je 16GB RAM, ve Správci úloh vidí, že Excel (32bit) žere kolem 890MB paměti.
Novější Excely s tím nemívají problém, doporučen je samozřejmě 64b Office.
Jinak bych to zkusil naimportovat do Accessu, ale tam fungují jen některé typy XML.
Zkusil jsem ten největší soubor do Accessu (2007) dostat, šlo to, ale nenačetlo se to tam celé (jen něco přes mio záznamů, možná nějaké omezení starší verze?). Výsledek je v 5 tabulkách, bohužel bez nějakého společného ID. Vytvořil jsem tedy vlastní, šestou, připravil chlívečky s tím, že to tam z těch původních tabulek copy/pastnu. A tam jsem skončil, schránka vezme jen nějakých 64 tisíc řádků, s tím se drbat nemíním
Zkusím to případně ještě v Office 2019 (manželka). Není to nic důležitého, spíše mě to zajímalo, z how_to pohledu
Vypsat data do tabulky v php jde např. takto (vypíše všechny id s tradeName):
Vypsání je prakticky okamžité u toho 16 MB souboru datafile-seznam_ds_ovm
Vypsat se dají všechna data nebo si to klidně můžeš místo vypsání do tabulky hodit do databáze.
Zkusil jsem vypsat id, jméno a příjmení do tabulky z toho půlgigového souboru datafile-seznam_ds_fo, vypsané v prohlížeči to bylo odhadem asi za 20 sekund.
A v případě potřeby ten xml může být v zip archivu (místo 500 MB má soubor 30 MB), v tom případě se to xml načítá takto:
Kdo umí, umí. Kdo neumí, čumí.
Nezkousel jsi to v Google docs nebo MS online?
Nedávno jsem převáděl soubor velký (téměř 2GB) XML soubor do Excelu. Protože výsledek měl více řádků, než činí limit pro Excel, tak ho jmenovaný program nebyl schopen importovat. Následně jsem tedy vyzkoušel tři metody:
1) Online programy na webu; ani v jednom z více případů se mi to nepovedlo.
2) Script Power Shellu, který jsem našel na webu:
$xlsSpreadsheet = 51
$Excel = New-Object -Com Excel.Application
$WorkBook = $Excel.Workbooks.Open("c:\Test.xml")
$WorkBook.SaveAs("c:\Test.xlsx", $xlsSpreadsheet)
$Excel.Quit()
Tento script sice fungoval na většinu souborů, ale na tom mém gigantickém pracoval více jak hodinu, než jsem se nad ním smiloval a proces ukončil. A to jsem ho nechal zpracovávat na RAM Disku.
3) Rozdělení XML souboru na vícero menších, které by pak Excel pobral a mohl je nabídnout MS Accessu, kde by nebyl problém vytvořit jakkoli velkou tabulku databáze. V tomto směru jsem zjistil, že na webu se vyskytuje řada programů, které nabízejí rozdělení XML souborů zejména do formátu CSV. Některé jsou perverzně drahé, jiné zase na můj soubor nefungovaly. Tak jsem to zkusil primitivně, že jsem si ten velký soubor rozdělil v Total Commanderu na několik menších a každý z nich opatřil hlavičkou a koncovkou z toho původního.
Kupodivu to fungovalo. Protože jsem ale naprostý laik a ve struktuře souborů se vůbec nevyznám, tak nevím, zda by tato metoda rozdělení účinkovala na všechny typy XML.
Teď když to po sobě čtu, tak vidím, že jsem zapomněl zdůraznit, že po onom mechanickém rozdělení XML souboru a před přidáním hlavičky a koncovky je zapotřebí zkontrolovat celistvost jednotlivých záznamů.
Neni lepsi pouzit ty webove sluzby, ktere tam maji? Nez stahovat gigove fajly k sobe?
Webové služby ti ale nedají celý seznam k iteraci. Jsou to jen čistě SOAP pro vyhledávání.
Predpokladam, ze v tom chce vyhledavat, proto to stahuje. A ktomu se daji krasne pouzit ty ws...
Ten web používá GZIP kompresi, tak je to stáhlé hned.
Pokud to někdo nechce ukládat na disk, tak je to možné načíst rovnou do paměti a zpracovávat v paměti.
Pokud bys to potreboval, napisu ti nejakou malou utilitku, která to přehrne do Access nebo co si řekneš (třeba DBF).
Access má limit 2GB na databázi, pokud tam bude jedna tabulka, pak 2GB na tu tabulku - nějaká režie.
Pokud si tam přidáš indexy, bude to méně.
Já to zas tak nepotřebuju, zajímalo mě to spíše teoreticky :)
Asi nejjednodušší by byl převod do *csv nebo *dbf, s tím si poradí kdeco.
Pozadal jsem chatGPT, předhodil mu jeden node a on mi vratil kod na nacteni a zapis do souboru.
Schvalne zkusim, jak rychle to bude.
Asi bude dlouho trvat to nacteni a rozparsovani tak velkeho XML, nasypani do soubory by pak uz melo byt rychle.
Načtení, rozparsování toho největšího 1.65 GB xml pfo souboru a uložení do csv mi trvá celkem asi 45 sekund v php (kód je podobný jako ten výše uvedený) a zpracovává to jedno vlákno na AMD 5600G. Zpracováno je skoro 1.9 miliónu řádků.
520 MB xml fo soubor mi trvá asi 13 sekund, v něm je přes 600 tisíc řádků.
Nijak neoptimalizuju, dělám tím nejjednodušším způsobem.
Ještě poznámka, načtení toho csv fo v excelu je celkem fofr, zhruba do půl minuty (včetně 68 errorů, kdy sloupce cp a zip se vytvoří jako číselné, ale v některých případech tam není číslo), excel si daleko líp poradí s csv než s xml, s xml má asi problém.
pfo csv jsem v excelu ani nezkoušel, 1.9 milion řádků excel nepobere
Možná to zkusím nahodit i do mysql do tabulky v RAM nebo do sqlite
Pro Excel je lepší TAB delimited. Ušetříš velikost, a Excel to má mnohem jednodušší na parsování než se drbat s uvozovkami, takže je to rychlejší než CSV
Já dělal ten 640MB, odskočil jsem si na malou a když jsem se vrátil, bylo hotovo. Musím přidat timer, abych věděl, jak dlouho mu to trvalo. Skončil jsem s asi 761 000 řádky.
Tak ono je to v tom Excelu rychlé i tak.
Teď zkouším převod xml do csv tímto skriptem, dělá to validní csv pomocí php funkce fputcsv a je to celkem rychlé (0.4 s OVM, 17 s FO, 21 s PO, 56 s PFO), ukládám nejdřív do paměti a pak naráz uložím do souboru.
... a kdyby se někomu hodil převod z xml do sqlite pomocí php:
(na AMD 5600G: OVM 0.7 s, FO 26 s, PO 31 s, PFO 71 s)
Jen taková poznámka, bez PDO::ATTR_PERSISTENT => true mi to dělalo na AMD 5600G časy OVM 0.5 s, FO 16 s, PO 21 s, PFO 54 s.
Já bych na toho ChatGPT moc nespoléhal. Viz mé tristní zkušenosti popsané na 3183282-ms-potvrdil-pouziti-chatgpt-4-v-bing
Jde o kostru. Nemusíš se pak drbat s mechanickym opisovanim nodu. Zbytek si upravis, ale spoustu mechanicke prace mas hotove.
Ahoj Honzo (zdraví Paullus),
Tobě je hej, umíš programovat, ale co my lamy (ejhle rým).
Jinak nemohl bys PS Pad přizpůsobit, aby otevíral i velké soubory? Třeba ten největší XML soubor z DS (PFO) nezvládne.
Pak bych mohl ve svém oblíbeném texťáku používat tu svoji primitivní metodu rozdělovat XML mechanicky.
Takhle musím se skřípěním zubů používat různé Notepady ++, 010Editory a jiné paskvily...
Musel bys vzit 64b verzi PSPadu, tam není omezení na 2GB RAM jako u 32b verze. Ale pracovat s tím by byl opruz.
Já samozřejmě mám 64b verzi (5.0.7). Ale když chci otevřít ten XML soubor, tak mi to hlásí: Soubor XX nelze otevřít. Integer overflow.
Proverim
Tak jsem se dival. Ten nejvetsi soubor datovych schranek ma zprasene UTF-8 kodovani. Proto se v PSPadu dostane do vetve, kde se pokousis opravit UTF-8 a tam ten rezim uz ty velke soubory nezvladne.
Zkusim to nejak obejit.
Tím "zprasene UTF-8 kodovani" myslíš co konkrétně?
Jo, máš pravdu; já zapomněl dodat, že při pokusu o načtení jsem dostal celkem tři hlášky.
První se mne ptala, zda chci soubor opravdu otevřít, druhá oznámila, že obsahuje chybné UTF-8 kódování a opět se tázala, jestli ho chci přesto otevřít a až ta třetí byla definitivně zamítavá.
Pokud by byl ten soubor v poradku, tak by se otevrel.
Protoze je tam zprasene UTF-8 (zrejme namichane UTF-8 s CP1250), tak by doslo ke ztrate znaku a to u programatorskeho editoru je hloupe. Proto je tam to varovani a uzivatel ma moznost to otevrit takovym bocnim procesem, ktery kodovani nekontroluje. Ten se ale nevyrovna s tak velkym stringem.
Bud to z UTF-8 prekoduji rucne po svem nebo to pro velke retezce rozdelim a udelam navickrat.
Můžu vědět kde konkrétně je ten soubor utf-8 nevalidní?
Zkusil jsem mb_check_encoding v php na utf-8 a udává mi to, že ty soubory včetně toho největšího jsou utf-8 validní.
(Udělal jsem i ověřovací test souboru znaků české abecedy v utf-8 a ansi i mix (třeba utf-8 text s jedním ansi č) a mb_check_encoding to detekuje správně)
(mb_check_encoding kontroluje všechno, i mimo ty znaky, které jsem testoval)
Me to pri prevodu hlasilo invalid char mapping. Dal jsem to nezkoumal.
Takže zprasené je to, co vyhazuje tu chybu. Ne utf-8 v xml.
Asi máš pravdu. Já ten soubor oprostil od diakritiky, poté pro jistotu v PSPadu po rozdělení nechal překódovat do UTF-8 a po opětovném spojení se to chová naprosto stejně.
Přitom po rozdělení na dva 700 MB soubory to načíst šlo.
Bývalý místní Paullus?
Až neuvěřitelně bývalý. Když jsem tady působil, tak to jsi býval ještě čumil very young...
Vítej,
matně si vzpomenu, že jsi chtěl cídit nějaký mosazný přemět s minimem fyzického nasazení, pak sháněl cosi o tenkém klientovi.
Teda ty máš paměť jako slon! https://kutilska.poradna.net/questions/2224613-jak-odstranit-zelenou-vrstvu-patiny-z-mosazneho-predmetu
https://pc.poradna.net/questions/386103-jak-na-programy-urcene-pro-tenke-klienty-v-prostredi-windows-ce
Ahoj hoste, víš co je nejhorší?
Já si ta vlákna vůbec nepamatuji; jediné, v čem se tam poznávám je, že jsem se chtěl zase vyhýbat poctivé práci....
Čumile, tvoje hlava je stříbrný zvonek. Když si představím, že je ti jen o pár desítek let méně než mně, je mi do pláče.
Ono to asi nebude tak horké s těmi desítkami. Jsem ročník 56. Ale zamlouvá se mi Tvůj smysl pro humor a tak mi to utkvělo.
1956?
Tak to byl tuším rok, kdy mému nejmladšímu pravnoučeti diagnostikovali stařeckou demenci.
Ano, ano, pro Tvůj smysl pro humor si tě pamatuju.
Paullus! Zdravim te!
I já tebe, MaSo. Vidím, že i jako svědkovi historických epoch ti paměť stále slouží...
Zatim slouzi ale je to cim dal tim horsi. Uz to neni jako pred patnacti lety, kdy jsme tu analyzovali kazdy dil BBT...
Zda chceš, tak to celé mám aktuální v MySQL. ;)
Já si převádím denně (už 11let) XML do čitelné podoby tak, že si ho nastyluji.
Ale já ho potom jen čtu a kopíruji texty. V PSPadu mám užovatelský konvertor a je to během chvilky.
Jestli by to takto fungovalo i u velkého souboru (nevím, jak velký PSPad načte) netuším. Rovněž netuším, jestli by šly nadělat tabulky.
Nicméně někomu by se to mohlo hodit, proto tady odepisuji.
Konvertor vypadá takto (začátek):
A CSS soubor vypadá takto (začátek)
Celé to potom vypadá takto: