[megoldva] mysql -> xlsx (2 millió sor)

Urak!

Elegáns és gyors megoldást tud valaki a fenti problémára?
A feladatot nehezíti, hogy ékezetes szavak is vannak az adatok között.

(Phpmyadminban az "export csv"-t az ékezetek miatt nem jól veszi be az excel, - csak az openoffice, viszont az nem tud xlsx-re konvertálni.)

Egy megoldás - lentebb többen tanácsolták:
2 db 1 milliós csv-t húzzunk le mondjuk phpmyadminnal (nem fog belefagyni, hiszen nem processzor ill memóriaigényes csv-t gyártani)
majd excelben:
Data menü -> get external data -> import text file. És itt be lehet állítani a karakterkódolástól kezdve minden hasznosat.

végül az output.xlsx két darab sheeten fért el, és 90 MB lett :)

Hozzászólások

Ha van valami programozási gyakorlat, akkor ezzel szerintem tudsz ilyet generálni egyszerűen: http://phpexcel.codeplex.com/
Biztos van egyszerűbb is, de hátha nem.
Szerk.:
"Phpmyadminban az "export csv"-t az ékezetek miatt nem jól veszi be az excel, - csak az openoffice, viszont az nem tud xlsx-re konvertálni."
- De xls-be kéne neki tudni és azt a 2007-es Office meg tudja xlsx-be menteni.

nem eleg ha atkonvertalod az exportalt csv-t excel-nek megfelelo kodolasra (asszem utf16 kell neki)?

Próbáld inkább xml -be exportálni, a mysql client tud ilyent, a phpmyadmin is (tudtommal), és ha a felhasználást sem akarod lehetetlenné tenni akkor id, dátum, akármi logika alapján darabold ~25000 sor méretűre a kimenetet.

----
올드보이
http://molnaristvan.eu/

Pedig a microsoft szerint tud olyant: http://office.microsoft.com/en-us/excel-help/import-xml-data-HP01020640…
Mi több mintha én is csináltam volna olyant

Én ezt az egészet parancssorból csinálnám és a convertálást iconv -al csinálnám. Más felől meg ha office 2007+ akkor az nem esik kétségbe az utf-8/16 -tól

----
올드보이
http://molnaristvan.eu/

Ez döbbenet és tényleg nem megy bele az xml :@ a leírás amit belinkeltem hölyeség, még a saját exportját sem tudja importálni :@

Esetleg ha tudsz csinálj ODBC -t és azon keresztül kérdezgess le közvetlenül az excel -be, ja és 1048576 sornál több nem fér az excle 2007 -be

----
올드보이
http://molnaristvan.eu/

pedig a csv, majd excel200x-ben save as xlsx a megoldás... az xlsx bonyolultabb formátum mint az xls, pedig az utóbbi bináris konténer...
phpmyadminban próbáld azt, hogy minden mező köré "-t rakatsz, ezt lehet hogy hexában kell megadnod ha nem megy és utf16-ban, ahogy fentebb említették.
Ha nem megy, holnap rápróbálok melóból.
Esetleg load data outfile, majd sed.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.

Excel cvs importban állítsd be a kódolást talán. (Adatok -> Szövegből -> megnyitod -> itt beállítod a kódolást)

--
Don't be an Ubuntard!

> az "export csv"-t az ékezetek miatt nem jól veszi be az excel

nyitsz egy üres táblát, aztán excelben Data -> Import external data, és ott szépen be tudod nyalni a csv-t tetszőleges karakterkódolással. (az office2007/2010-ben nyilván valahol eldugták a ribbonon ezt a funkciót, de gondolom ugyanúgy meg lehet csinálni, mint a "rendes" excelben)

Végigfutottam a 2007-es Excel sorain, de 1048576 volt az utolsó érték. Ez messze van a 2 milliótól, amit a címben említesz.

A legegyszerűbb megoldás: generáltass egy HTML táblázatot, csak ez legyen a fileban, és nevezd áz .XLS-re. Az Excel meg fogja nyitni, onnan meg mentsd el xlsx-ként. Az egyik leghasznosabb Excel-hack :)

Nem fog menni, régi Excel 65536 sort támogat, új ~1M-t.

----------------
Lvl86 Troll

Jó gondolat lehet a csv, főleg ha tabszeparáltan készíted az exportot (átláthatóbb lesz). A feldarabolás kihagyhatatlan feladat 2 x 1.000.000 soros csv fájlokra. Többen javasolták a "daraboló" scriptet, fogadd meg. ;) Viszont ...

* (Phpmyadminban az "export csv"-t az ékezetek miatt nem jól veszi be az excel, - csak az openoffice, viszont az nem tud xlsx-re konvertálni.)

Feltételezem UTF8-ban van a MySQL adatbázisod és az exportált fájl is. Így ha megnyitáskor beállítod a karakter kódolást utf8-ra, akkor nem lehet vele gond. Másik dolog, hogy eddigi tapasztalataim alapján az MS Office Excel sosem tudta a csv-t feldolgozni normálisan, ha ;-vel van szeparálva a fájl, nagyon enyhén kifejezve tudatlan hozzá. A megoldás, a csv kiterjesztést átírod txt-re, majd azt megnyitod Excelben és felkínálja, hogy válaszd ki mivel van szeparálva a fájlod. Utána mentheted a megnyitott fájlokat .xlsx-be vagy amibe szükséges.

2 millió sort nem táblázatkezelőben, hanem adatbázisban tartunk, az való arra. onnantól kezdve, hogy legalább kettő részre szét kell cincálni a listát, már elvész az értelme a számolótáblának, hiszen szűrni, számoltatni a teljes adathalmazon nem fog tudni, hiszen fele itt, a másik fele meg amott lesz, de performanciában (pl. rendezés) is eléggé gyengén fog muzsikálni.

Az adattárolás részével tökéletesen egyetért mindenki, viszont sok, hozzá nem értő ügyfélnek elég nehéz bemagyarázni, hogy amit kér az ne export, hanem egy DB dump legyen, ha pl. migrálásról van szó, mert a kettő nem ugyan az. Sajnos ilyen fejetlenségből sokat láttam, az ügyfél pedig makacs a legtöbb esetben.

Oda kell neki rakni a jó esetben két bazi nagy, rosszabb esetben két nagy, meg egy pici fájlt, hogy itt van, kezdjél vele valamit... Bár ha netán laponként lehet xls-ben 1M sort kezelni (nem tudom, az ilyen, határokat feszegető baromságokat szerencsére eddig sikerült elkerülni), akkor két lap, meg jó sok memória, és belefér az :-))

Csak úgy: Mit kezdenétek egy 2 millió soros xls-el?

Ha csak diagramok, statisztikák készítéséhez kell az egész művelet, akkor inkább adatbázisból kérdezd le a szükséges adatokat, és a kapott eredményt tedd át Excel-be. Szerintem ez lenne a legegyszerűbb, persze ha nincs valami kizáró oka...

Az én két centem (amellett, hogy egyetértek azokkal, akik szerint eleve őrültség millió sort akármilyen excelben tartani):

Én perlben csinálnám. A MySQL részére a dolognak ott van a DBI, ami bejáratott és jól dokumentált dolog, az XLSX-re pedig az Excel::Writer::XLSX, ami ugyan új, de aktívan fejlesztett és nagyrészt működik. A kettő között pedig ízlés szerint lehet a karakter-kódolást kijavítani (az Encode::* modulokkal például).

Az megvan ugye amit fentebb többen is írtak, hogy az xls-be max 65535 sor fér, xlsx-be pedig csak 1048576? ami kb pont a fele a kétmilliónak?
Az ötletek mind jók, de a végső lépést, az xlsx-be mentést nem fogjátok tudni megcsinálni. Vagy ha igen, akkor az excel kétezersok nem fogja tudni megnyitni.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.

szerény és jelentéktelen véleményem szerint már ezer sor felett kell a probléma megoldását áttenni rdbms-be, bár egyes kollégáim szerint ez 2-5k körül van, mások szerint ami nem fér ki a képernyőre, annak adatbázisban a helye.

--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.

Nekem ezt a főnököm így mondta: "azt a programrészt, ami (megjegyzésekkel együtt) nem fér ki egy képernyőre, azt szét kell darabolni szubrutinokra (gy. k. függvény, eljárás, procedura)". Hozzáteszem, ezt a 80x24-es terminálok idején mondta.

Mindez látszólag az olvashatatlan kódok írására serkenti az embert, de nem sok nála áttekinthetőbben kódolóval találkoztam.

Majd arról is számolj be, hogy hogyan tudják használni ezt a buznyák nagy számolólepedőt :-)

Szűrnek, keresnek, ellenőriznek benne.... Olyan kollegák ezek, akiknek esélytelen az excelen kívül bármi mást a kezükbe adni.

+ normális munkavégzésnek számít nekik a 200 oszlopos excel file, soktízezer (százezer) sorral, egyes műveletek között a több perc várakozás, majd az eredmény kimásolása egy másik excelbe (10-20 mb), majd ezeknek az e-mailen való küldözgetése.

Szóval agyrém az ami itt megy, szerencsére csak nagyon adhoc módon veszek ebben részt. Ekkor az excel file-okat beleteszem mysql-be, a kért feladatot végrehajtom, majd kiexportálom.

Az exportálást eddig úgy oldottam meg (500 ezer rekordra kb), hogy:
-export csv,
-majd openoffice-val megnyitás,
-majd tabokra szétvágtam (50 ezer soronként),
-xls-be mentés, majd
-excellel megnyitás
-tabokról egy tabra visszamásolás
-xlsx-ben elmentés

no a fenti műveletsor egy 500 ezres csv esetén kb 2,5 órát vett igénybe (lassú a 2,7 ghz-es core2duo-s, 4GRam-os imac-em ehhez), nem beszélve arról az időről, amit más módszerek próbálgatásával töltöttem.
Szóval agyrém, agyrém!!!

Nem akarok nálatok megváltani az akarata ellenére sem pénzügyest, sem marketingest, de esetleg ha felvetnéd nékik, hogy mondjanak egy v. több olyan szempontot, amely csoportosítási tényező lehetne, és azok szerint nyomnád N darab fájlba azt a dbdumpot, még tán valamelyik csokit is vinne, mert észrevenné, hogy ugyan nem talál meg mindig mindent egy oldalon, de az egyenkénti megnyitás-feldolgozás-bezárások (ha már egyszer úgyis csak ennyire képesek egy közgáz után) élményindexe veri a homokóráét.

nehany tipp: phpmyadmin csv gyartasnal mindenfele okos stringmuveletet csinal, ami meglepoen le tudja lassitani az exportot.
excel-t ugy lehet ravenni hogy egy CSV-t utf-8 encodinggal nyissa meg, hogy beszursz a csv export elejere egy BOM-ot.
anno nekem a realtime generalt csv-knel a kovetkezo php kod megoldotta hogy a letoltott fajlt az Excel megnyissa, es megfelelo encodinggal tegye:


header("Content-type: application/vnd.ms-excel");
header("Content-disposition:  attachment; filename=multi_headword.csv");
// BOM
echo chr(239).chr(187).chr(191);

ezutan jottek a sorok, oszlopok " kozott, ;-vel elvalasztva.

ahogy fentebb javasoltak mysqldump is tud csv-be menteni, de kozvetlenul hasznalhatod a SELECT ... INTO OUTFILE szintakszist is.
az export_options reszben megadhatod hogyan legyenek elvalasztva a sorok es az oszlopok.

ez lenne a leggyorsabb megoldas, utana mar csak egy BOM-ot kellene beszurnod, ha jol emlekszem, es szepen UTF-8-al nyitna az excel.

ps: uhh, igen az 50k-s sorlimitet elfelejtettem. :/
ps2: erdemes lehet megnezni a kovetkezo 2 libet, ha jol emlekszem a topicnyito otthon van a PHP-ben:
https://github.com/iliaal/php_excel fizetos libxl libre PHP wrapper
http://phpexcel.codeplex.com/

Tyrael

Csak az utokor kedveert, hatha valaki megtalalja meg a threadot:
- phpexcel egy nagyon jo cucc, sokat tud es eleg jol, de NE akarja senki hasznalni gigantikus tablazatokra, mert ahhoz tul lassu.

Tyra3lnek meg annyit tudnek hozzafuzni meg, hogy az Exceles 64K/1M-s harlimitet sehogy sem fogja tudni atlepni - ahogy irtak tobben is -, akarmilyen libet is javasol.

----------------
Lvl86 Troll