Nagyméretű CSV fájl megnyitása PHP-vel
2021-04-18T17:08:22+02:00
2021-04-18T21:49:38+02:00
2022-08-12T02:10:30+02:00
*deleted_23419333
Sziasztok!

Kaptam egy hatalmas, közel 1 GB méretű CSV fájlt.

Hogyan tudnám ezt megnyitni PHP-vel? Van lehetőség arra, hogy mindig csak egy sort olvassak be a fájlból?

Például:

http://valami.tld/?sor=1

<?php // kiolvasni a fájlból a $_GET [ 'sor' ] sort. // beolvasni ezt a sort, majd MySQLi INSERT. ?>

Ebből csinálnék JavaScript-tel és AJAX-szal egy folyamatot, amit bármikor meg lehetne szakítani, ha esetleg hiba lép fel vagy bármi közbejön. Ehhez viszont jó lenne tudnom a fájl sorainak a számát. Van erre lehetőség?

Korlátozottak a lehetőségeim, mivel jelenleg csak egy osztott tárhely áll a rendelkezésemre, de az legalább egy izmosabb.

Előre is köszönöm.
Mutasd a teljes hozzászólást!
A nehezebb módszer az, hogy bájtonként olvasnám a fájlt, mondjuk X soronként. Megkeresném a fájlban, hányadik bájtnál van az X. sor vége (a \n karakter), majd az előző futás utolsó pozíciójától felolvasnék ennyi bájtot a fájlból.
1) fseek-kel ráállsz az utolsó futás által feldolgozott bájtpozícióra (vagy a 0.-ra, ha még nem futott)
2) olvasod a bájtokat és másolod memóriába, amíg meg nem találod az X. \n karaktert
3) \n vagy \r\n karakter mentén előállítod a sorokat
4) feldolgozod a sorokat
5) mented az állapotot, miszerint az utolsó beolvasott adat a valahányadik bájtnál volt
6) response-ban visszaadod, hogy van-e még hátralévő adat.

Az egyszerűbb módszer az, hogy a gépemen a nagy CSV-t feldarabolnám sok kis CSV-re (a headert mindig odamásolva), majd külön-külön importálnám őket.

Mondjuk szerintem ezt nem a PHP oldal feladata lenne csinálni. Miért nem expose-olsz egy REST API-t, amihez írhatsz egy kis toolt, ami a gépedről megcsinálja a feladatot?
Mutasd a teljes hozzászólást!

  • egyszerűbb módszer az, hogy a gépemen a nagy CSV-t feldarabolnám

    Ezzel próbálkoztam:

    split -l 20 big.csv newcsv

    Ez létrehozott annyit fájlt, hogy az rm -r parancs is meghasalt alatta, pedig megakadályoztam a parancs teljes lefutását. Az rm -r helyett a megoldás:

    find . -type f -delete

    Ezt csak az utókornak írtam, ha úgy járnának mint én.

    A 6 pontból álló leírást köszönöm. Arra esetleg van lehetőség, hogy a fájl sorainak számát megtudjam PHP-vel?
    Mutasd a teljes hozzászólást!
  • Arra esetleg van lehetőség, hogy a fájl sorainak számát megtudjam PHP-vel?
    A számítástechnikában valójában nincs olyan, hogy "sor". Bájtsorozat van - azt tudod csinálni, hogy végigolvasod a fájlt bájtonként és összeszámolod, hogy hány "\n" (Unix) karakterrel vagy "\r\n" (Windows) karaktersorozattal találkoztál eddig.
    Mutasd a teljes hozzászólást!
  • Tudom, hogy egy téma egy kérdés, így ez már tényleg csak offtopic.



    PHP/JavaScript (AJAX) megoldást szeretnék írni és szeretném ha lenne egy számláló, hogy hányból hanyadik sornál tartok vagy esetleg ezt százalékosan kiírni, illetve a körülbelüli hátralévő időt ezekből az adatokból kiszámíthatnám és ki is írhatnám és emiatt kérdeztem, de akkor ez nem megoldható.

    Vagy mégis? Ha az első \n vagy \r\n sortörést megtalálom, akkor tudni fogom, hogy az első sor hány bájt volt és ez alapján feltételezhetem, hogy a többi sor is ennyi lesz és akkor nagyjából már tudni fogom, hogy hány sort tartalmazhat a fájl.

    Vagy minden sor beolvasása után megszámolom az összes már beolvasott sor bájtjait és akkor abból százalékosan már tudni fogom, hogy mennyi bájt van már beolvasva és mennyi bájt van még hátra.

    Ez megoldható lehet?
    Mutasd a teljes hozzászólást!
  • Valójában ha bájtonként dolgozod fel a fájlt, nagyon szép progress bart tudsz a felhasználónak mutatni.
    1) AJAX-szal meghívod a PHP-t.
    2) A PHP beolvassa, hogy a 265. bájtnál tartott az előbb.
    3) Feldolgoz mondjuk 200 sort.
    3) A PHP tárolja, hogy most már az 17246. bájtnál tart. A kliensnek pedig response-ban visszaadja ezt:

    { "position": 17246, "length": 1048576 }
    Mutasd a teljes hozzászólást!
  • Ilyen betöltést ne böngészőn és webszerveren keresztül akarj, erre való a shell-elérés.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd