Fórumok
Sziasztok!
Már napok óta szívok az alábbi problémával:
Van egy XML fájlom. Itt tekinthetitek meg: http://pastebin.com/02brCLhk
Ez egy árgépes xml fájl (helyesbítek: ezt tölti le és eszi meg az árgép), egyetlen termékéről szóló rész, de ezt szorozzátok be úgy 5000 termékkel. A fájlméret meglehetősen vaskosnak mondható: 2 MB körüli.
Ebből kellene nekem faragnom egy CSV fájlt, de nem olyan egyszerű ám ez!
Próbálkoztam XML2CSV konverterekkel meg online konverterekkel, de egyik se ette meg, mondván parse error.
A dolgot nehezíti, hogy akad a description-ben ; (azaz pontosvessző) is.
Mi a megoldás?
Bármilyen ötletre vevő vagyok (Googleztam is már, de kevés sikerrel jártam.
Köszi előre is a segítséget.
Hozzászólások
Az ÁrGép-esek szívesen segítenek, gondolom: keresd meg őket.
Üdv,
Marci
Nem az árgéphez kell a CSV fájl. Maga az XML fájl árgép kompatibilis.
--
-- GKPortál Blog
Tégy Jót!
Legyen neked is Dropbox tárhelyed! :)
Itt az ideje nekiállni programozni vagy regexp-es cserefunkciót tartalmazó szövegszerkesztővel nekiesni. :)
Aki XML fájlt regexppel akar feldolgozni, az hülye és tiltani kellene az IT-től.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
És aki sed-del ír bele, az mit érdemel? :D
Láttam már ilyeneket. Aztán valahogy mindig volt valami gondja, ami miatt patkolni kellett. Miután ki lett baszva az egész a picsába és egy rendes XML olvasására készített osztály lett beállítva, hirtelen megszűntek a nyűgök.
Amikor meg hibás XML-t kaptam, valahogy mindig kiderült, hogy valami turpisság van a túloldalt.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
Mér' há' mi mással?
Mi az állítás?
- A regexp alkalmatlan algoritmus megvalósítására?
avagy
- Normális-e az olyan IT szakember, aki adatokat tárol egy olyan formátumban, ahol a sorvég"jel" is egy algoritmus?
:)
Nem tudom ki és miért akar regexppel szopni mikor a fenti feladat kb. ennyi:
Ezen nincs mit elbaszni. Regexpen ezer dolgot lehet. Arról nem beszélve, hogy ezer+1 olyan dolgo van az XML-ben, amit nem biztos, hogy le fogsz kezelni egy regexp kifejezésben, ellenben egy regexp parser le fogja.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
+1
Aki azt gondolja, hogy ez egy feldolgozási feladat - az hülye és tiltani kellene az IT-től.
Csókollak. ;)
Oké konvertálás. Valahol beleesik a feldolgozás témakörébe.
Nem ez volt a lényeg.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
A lényeg: amíg az adat nincs a kezembe, addig NINCS.
Magyarázat: (Közben megláttam ezt a hozzászólásodat is: http://hup.hu/cikkek/20150107/sokszor_ugy_erzem_az_informatikaval_szakm… )
Az előbbi hozzászólásomat kissé továbbfejlesztem. Az xml elég precíz formátum - lehetne. Csak adatokhoz nem értők is használják.
Konkrét példa:
- A mező neve: irányítószám
- Érvényes: numerikus 1-5 karakter (Segítek: Magyarországról van szó!)
Mivel még fejlesztés alatt volt, a telefon nevű tool-hoz nyúltam. Elmagyaráztam a formátum föltalálójának (külső cég, csak ezért alkalmazva), hogy kis országunkban az 1, 2, 3 és 5 jegyű irányítószám nem van. Viszont kellene 0 hossz - már ha megegyezünk - mert olyan meg van, hogy nincs. Ti. irányítószám ;)
Szóval, logikád szerint az az informatikus, aki jól használja a jól bevált eszközöket, de fingja sincs az eszközök által kezelt adatokról?
Helyette mondjuk inkább, hogy a jól konvertálható adatok a továbbiakban nagyobb valószínűséggel dolgozhatók fel helyesen.
Bezzeg a topic folyik, minden IT guru tudja melyik a legjobb tool! Nem szánalmas?
Ez egy teljesen másik problémakör, amiről te beszélsz.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
A nem olyan jól konvertálható adatok is könnyebben dolgozhatók fel egy, a nem olyan jól konvertálható adatformára kihegyezett eszközzel.
(Írom ezt a triviát úgy, hogy direkt mazochizmusból hajdan mentettem rekordokat tönkretett dbf-ből (klasszikus módon * commanderben megnyitották szerkesztésre, aztán gyorsan rá is mentettek, kidobva a fejléclezáró karakterpárt) awk+dd használatával, aztán ugyanarra a problémára összegányoltam C-ben egy egylövetűt. Mindkét esetben ismernem kellett az adatszerkezetet, de az utóbbit nem csak futtatni, hanem megírni is harmadannyi volt. Ma meg ugyanerre használnám valamelyik oszlopszerkesztést tudó editort, fejben futtatva az oszloptördelés algoritmusát.)
http://stackoverflow.com/questions/1732348/regex-match-open-tags-except…
Kolléga pont most találta.
Röviden csak annyi, hogy XML-t nem lehet regexp-el parseolni, mert a regexp véges állapotú automatát ír le, az XML-en általában pedig nem tudsz végigmenni egy ilyen automatával.
+1
Az xml tényleg hihetetlenül bonyolult, így csak végtelen állapotú automatával kezelhető! ;))
http://en.wikipedia.org/wiki/Functional_programming
Ez roppant érdekes, de csak absztrakció. A végén elég sok ostobaságnak tűnő dologgal, miszerint a cpu architektúrát veti össze az absztrakciót megvalósító programnyelvek tulajdonságaíval.
Részemről hiányolom egy lsi elemekből megépített bipoláris processzoron megvalósított végesállapotú géppel kivitelezett xml feldolgozás leírását. Bár ez napjainkban nem mondható tipikusnak. :)
Egy automata megvalósítható funkcionális, imperatív, kevert és egyéb programozási technikával. Sőt gépi kódtól kezdve egészen az sql-ig bármivel.
A "végtelen állapotú automa" = kis irónia azt jelenti, hogy aki ilyen marhaságot ír a véges állapotú gépről (alias automata), annak vajmi kevés fogalma lehet annak mibenlétéről.
Szóval hatékonyabb lenne egy értelmes magyar mondat segítségével kifejezni gondolataidat: alany, állítmány, tárgy stb.
"A fájlméret meglehetősen vaskosnak mondható: 2 MB körüli."
Miért is? 2 Mb-s XML az semmi.
http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument%28v=v…
http://php.net/manual/en/class.domdocument.php
Nagyjából 10-15 sornyi kódból el lehet intézni ezt .NET-ben vagy PHP-ban. (Vagy akármi másban, ami nyújt valami hasonló osztályt.)
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
Vagy akár Java -ban ... csinálsz egy POJO -t aminek a struktúrája illeszkedik az XML -re, JAXB-fel felnyalod, aztán kiírhatod, bármilyen formában. Akár CSV-ben is.
--
arch,centos,debian,openelec,android
dev: http://goo.gl/7Us0GN
BCI news: http://goo.gl/fvFM9C
Igen, csak az ilyen egyszerű konvertálásokra simán nyitok egy LinQPad-ot és ott megcsinálom, aztán el is felejtem, hogy feladat volt. Mindenféle osztálygenerálgatás nélkül. :)
Amúgy .NET-ben is van valami XMl serializáció.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
off: hű bakker, ez a LinqPad zseniális, kösz, még nem ismertem.
Egy rövid lista, inkább magamnak:
XmlSerializer
DataContractSerializer
XmlReader/XmlWriter
XElement (LINQ)
Fuszenecker Róbert
Ezt még hozzá akartam írni:
"A dolgot nehezíti, hogy akad a description-ben ; (azaz pontosvessző) is."
Ismerni kellene a CSV-t is (avagy, miért nem lehet regexppel feldolgozni azt sem, illetve, hogy miért nem igaz az, hogy egy sor = egy rekord.) Idézőjelek közé kell tenni és TADA. (Persze, idézőjeleket is escapelni kell dupla idézőjellé).
De erre meg:
http://php.net/manual/en/function.fputcsv.php
Nem kell újra feltalálni a spanyolviaszt, hanem használni kell a meglévő, jól kidolgozott függvényeket, osztálykönyvtárakat.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
A tesztet ez simán megcsonálta xls-be.
http://www.luxonsoftware.com/
Onnan meg libreofficebe kimented csv-be.
pch
--
http://www.buster.hu "A" számlázó
--
ezt nekem pl az excel tök használhatóan megnyitja.
Persze.
Szó szerint hat kattintásba került betölteni a példa XML-t úgy, hogy még a kapcsolat is élő maradt (ha belemódosítok excelen kívül, az áttöltődik excelbe)
De nem érted, Excelben kattintgatni bárki tud, az nem olyan menő, mint awk-val regexpre rejszolni :(
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
Udv,
En hasonlo cipoben jartam, akkor php dolgozta fel az xml fileokat, es xlsx-be convertaltam at oket phpexcel segitsegevel, mivel a CSV szetesik ha "newline" karakterrel talalkozik. (illetve parallel egy adatbazisba is el kellet menteni az xml tartalmat, ami siman ment php-bol)
", mivel a CSV szetesik ha "newline" karakterrel talalkozik."
dafuq did i just read? :)
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
Egy PHP-s kommentjét.
that post gave me cancer
Magam részéről felterjesztettem egy hupmeme díjra.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
Olyat is lehet? Néhányszor nekem is eszembe jutott, hogy lassan kéne egy submission form gabu honlapjára...
Tedd fel magad is: http://gabucino.hu/archive.htm#2013-12-20-06:44:32
Benne vagyok, csak nem különösebben tulajdonítok neki nagy jelentőséget. Pusztán szórakozásból szoktam nézni, hogy van-e valami új cringe thread, amiről esetleg lemaradtam volna.
Bocs ha nem tudtam magam rendesen kifejezni.
Talakoztam mar sok olyan csv file-al amit adatbazisbol generaltak (SAP MDM), es ha az adott mezoben olyan stringet taroltak amiben newline/sortores/hogyishivjak volt akkor a csv file-t excelben megnyitva ezen a bizonyos ponton a sorok elcsusztak.
Szoval nem a CSV esik szét hanem a file excelben/openoffice-ban valo megjelenitese valik feletteb bosszantova. Foleg ha par szazezer sok kozul van huszon egynehany ahol ez elofordul.
Akkor kerlek, az nem CSV volt, csak CSV-nek látszó tárgy, mert a CSV-ben ez a probléma tökéletesen megoldott. Maximum a SAP nem escapel normálisan.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
ez igy nem teljesen igaz, korrektul escapel, csak a 3rd party alkalmazas ami feldolgozza a csv-t egy fos es nem tudja normalisan ertelmezni.
De visszaterve az eredeti temahoz itt egy egyszeru, pelda simplexml-el.
<?php
$file='teszt.xml';
$xml = simplexml_load_file($file, 'SimpleXMLElement',LIBXML_NOCDATA);
$csvarray=array();
foreach($xml->item as $item){
$csvarray[]=array(
$item->manufacturer_name,
$item->product_sku,
$item->product_name,
trim(preg_replace('/\s+/', ' ', $item->product_desc)), // sortores kiszedese
$item->product_price,
$item->product_availability,
$item->picture_url,
$item->price_with_tax,
);
}
$fp = fopen('cav_file.csv', 'w');
$delimiter = chr(9); //tab
$enclosure = '"';
foreach ($csvarray as $fields) {
fputcsv($fp, $fields, $delimiter, $enclosure);
}
fclose($fp);
unset($csvarray);
echo "vege";
Minek kiszedni a sortörést?
Másik, te LO/Excelt említettél, ott Sosem volt gondom a normális CSV-kkel.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
A parse error nem véletlen. Amit posztoltál, az a rész hibátlan. Keresd meg a parse error okát, és szüntesd meg. Ha megvan, ez is működik, pl.:
sed -i ':a;N;$!ba;s/\n/\t/g' teszt.xml
xml2 < teszt.xml > teszt.txt
2csv item manufacturer_name product_name product_desc product_price product_availability picture_url price_with_tax < teszt.txt > teszt.csv
Direkt szedtem 3 sorra, hogy lássad, mit csinál lépésről lépésre.
Kérdés: ha már hozzáférsz a szerverhez, nem egyszerűbb egyenesen az adatbázisból kiolvasni, ami neked kell, és egyből csv-t írni?
Update: ha jól látom, virtuemart motor van alatta, ajánlom átnézésre: http://www.csvimproved.com/en/support/204-export/virtuemart/842-export-…
--
Coding for fun. ;)
A CSV Improved nem játszik, mert ahhoz túl sok termék van.
Ezt a 3 sort holnap kipróbálom. :) Köszi!
--
-- GKPortál Blog
Tégy Jót!
Legyen neked is Dropbox tárhelyed! :)
Nem jött össze. :(
A CSV-ből ennyi marad (persze, maga a fájl tartalmazza a 4000 terméket):
Egy sort idézek:
A gond az, hogy maga a termék tartalmazza a többi leírást is, és az nem kerül bele, csak a Youtube link.
Mi a gond?
--
-- GKPortál Blog
Tégy Jót!
Legyen neked is Dropbox tárhelyed! :)
Valószínű, hogy nem \n a sorvég karakter. Első parancsnál a megfelelőt add meg. (Lehet \r is pl.) Még mindig azt mondom, hogy egyenesen az adatbázisból kérd le az adatokat, jobban jársz.
--
Coding for fun. ;)
XMLt sed-del parsolni ugyan lehet, de eleg rovidlato otlet.
http://en.wikipedia.org/wiki/XSLT
itt az XSL, modositsd kedvedre: http://pastebin.com/JS7VRv8x
meghivas, hasznalat:
asd@locutus:/tmp$ xmlstarlet tr tmp.xsl tmp.xml
KORG;korg_pa50sd;KORG Pa-50SD ajándék puhatokkal;145669.00000;;http://www.csutorhangszer.hu/components/com_virtuemart/shop_image/product/KORG_Pa_50_4a0d7361b9457.jpg;185000;
asd@locutus:/tmp$
Latom az egyetlen epeszu megoldast meg senki nem nezte meg :)
PHP alatt is mukodik: http://php.net/manual/en/xsl.examples.php
--
Az Extensible Stylesheet Language Transformations (röviden XSLT) XML-alapú fájlformátum illetve a hozzá tartozó feldolgozó rendszer. Az XSLT feldolgozót XML dokumentumok más, ember által könnyebben értelmezhető formátumra alakításához használják. A konverzió során az eredeti file megmarad, s annak tartalma alapján létrejön a célformátumban egy új fájl.[1]
A keletkező dokumentum formátuma lehet többek között XML, HTML, XHTML, PDF vagy normál szöveg.[2] Az XSLT-t gyakran használják különböző sémájú XML dokumentumok közötti konverzióra, dinamikus weboldalak létrehozására és PDF dokumentumok generálására.
+1
az összes többi hozzászólást törölni kellene (beleértve az enyémet is :-D)
Leszámítva, hogy az XSLT szintaxisát nem véletlen utálja az emberek 99%-a :)
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
Amit az emberek nem ertenek, azt vagy utaljak, vagy felnek tole.
Ez így igaz, viszont amit nem értenek, abban nem sokat vezet előre egy konkrét feladattal kapcsolatban egy odavágott wiki link, amely kb. mindazt tartalmazza, amit a szóban forgó dologról az is tudja, aki nem érti, viszont többet se nagyon taglal.
Ennyi erővel az IBM DB2 linkjét is be lehet dobni válaszként - mert tényleg az - csak érteni kell hozzá.
Ezert kommenteltem hozza egyreszt a gyorsan altalam megcsinalt konkret megoldas linkjet, masreszt a wikipedia-rol a szocikk bevezeto reszet ;)
Végre, már azt hittem senkinek sem jut eszébe, ahogyan olvastam az ötletelést :)
+1
Nézd meg a Pentaho Spoon nevü eszközét, az ilyesféle adattranszformációkra való. Az ezzel előállított KTR fájt utána akár automatizáltan is futtathatod.
--
Pásztor János
Üzemeltető Macik
Kicsit useless comment, elmélet:
http://en.wikipedia.org/wiki/Delimiter-separated_values
Sok helyen nem veszik a fáradságot a mezők kezdetének és végének jelölésére (field enclose). Ha ez megtörténne, akkor row delimiterek és a field separatorok használata az értékben nem törné el a CSV-t. Ezt nagyon megtanultam, amikor Infobrightot etettünk CSV-vel.
-----------
"Pontban 0:00-kor nem nagyon szoktak véletlen dolgok történni"
Telekom szektorban is szeretik a CSV-t es szopunk is vele. A rajtad emlitetteken kivul tudom emliteni a struktura teljes hianyat (1 dimenzios adatszerkezet), a tartalom kodolasanak egyeb fogyatekossagait (ujsor karakter, idezojel), valamint a valtoztatasok (change management) bonyolultsagat.
Amugy BER kodolason (http://en.wikipedia.org/wiki/X.690#BER_encoding) semmi nem fog ki ;)
Jó rég volt egy eset, amikor totál ellenőrizhetetlen adatokat tartalmazó csv-ben akartak átadni adatokat, akkor azt találtam ki, hogy az adatokat a csv felépítése előtt base64-gyel kódoltattam, a saját oldalon így már ellenőrizhető bemenetem volt.
--
Coding for fun. ;)
Nem tudom, jól értettem-e, amit írtál, de az én kontextusomban nem a formátummal van a baj, hanem azzal, ahogyan használják. Maga a CSV teljesen oké, csak tudni kell használni.
-----------
"Pontban 0:00-kor nem nagyon szoktak véletlen dolgok történni"
Osszefoglalva azt irtam, hogy a formatum eleg limitalt, es ha valakinek kelloen osszetett adatai vannak (fa-struktura, binaris tartalom), jobb ha nem probalja CSV-be 'tuszkolni' oket.
Na az olyan embert kell eltiltani az IT-tól :)
Mi anno az Inforbright-ba töltendő adatokat MySQL-ből CSV-ben nyertük ki (LOAD DATA INTO ... INFILE ...) és azt adtuk oda neki. Mentségemre szóljon, hogy a community edition-nél nem volt más lehetőség.
-----------
"Pontban 0:00-kor nem nagyon szoktak véletlen dolgok történni"
A titok inkább abban rejlik, hogy tudni kell nem használni.
Lassan jobban árulkodik az ember előéletéről konfig-/(meta)adatkezelése, mint a szakmai önéletrajz.
Aki ha belepusztul is, struktúrálatlan szövegfájlokat használ, kulcs-érték párokkal, régi, junikszónli motoros.
Ha ugyanezt teszi bármi áron úgy, hogy a kulcsok pontokat is tartalmaznak, belenőtt a java propertykbe.
Aki nem-delimitált ASCII-t dob a környezetbe, valószínűleg az ősz szakállával takarózik, a munkahelyén csak egy nála idősebb fordul elő: a gép, amit kezel.
Akinek a horizontját a CSV jelenti, időnként beír a HUP-ra, a linuxfikázó topicokba.
A mindent JSON-ozók az ls/dir parancsot is úgy kezdik, hogy <?.
Aki pedig az XML-t nem hajlandó soha másra cserélni, az nagyon modern, nagyon enterprájz, és nagyon fiatal.
Elnézést, ha kihagytam valakit!
Utólagos engedelmeddel smitteltem.
Hogyne, használd egészséggel... ha ér annyit.
Microsoftos fejlesztőtől hallottam: az XML olyan, mint az erőszak. Ha nem működik, az azért van, mert nem használsz belőle eleget. :)
Van valami viccesed a yaml-rol vagy a `binarist` hasznalokrol is ?
Amit nem lehet megirni assemblyben, azt nem lehet megirni.
Ugye ezért nem fizetnek egy vasat se?
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
Szóval ez volt az a marha nehéz feladat, amit napok alatt nem lehet megoldani?
http://shared.muportal.hu/csvplz.txt
Rossz látni ezt az awk, stb. szerencsétlenkedést.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
lol
> Rossz látni ezt az awk, stb. szerencsétlenkedést.
+1 Írt itt valaki egy tökjó posztot arról, hogy miért egészségtelen az, ha mindent szövegként akarunk kezelni.
szerk: ja, hogy az pont te voltál :) (http://hup.hu/node/123916)
Ugyanez C#-ban, 8 perc:
http://shared.muportal.hu/csvplz2.txt
(Szerk.: Oké, Linqpadban írtam, de kb. ugyanezt kell a VS-be is beírni. Viszont Linqpadból ingyenes van, szóval ott még auto complete sincs.)
(Szerk. 2: Elfelejtettem említeni, hogy itt írtam egy Escape() metódust, mert nem volt humorom kikeresnem, hogy .NET alatt mivel írunk CSV-t szabályosan. Házi feladat.)
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
"Viszont Linqpadból ingyenes van"
De aki mindenképpen ragaszkodik a VS-hez, letöltheti a Visual Studio 2013 Community Editiont.
Fuszenecker Róbert
LinQPad azért másra van. Az csak ilyen firkapad, míg a VS egy rendes IDE. (Mellesleg ez a komplexitású program egy notepad(++)-al megírható és konzolból csc-vel lefordíthatható, ami úgy is ott van minden .NET telepítésben...)
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
Felkeltetted az érdeklődésemet, megnézem a LinQPad-et.
Fuszenecker Róbert
Na, számomra ez az igazi bónusz, PowerShell:
Egy hátránya van, nem tudom, hogy a CDATA-s részt hogy lehet vele kibontani, ezt is most ollóztam össze googleből, nem ismerem a PowerShellt egyáltalán.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™