ugrás a tartalomhoz

nagy méretű csv importálás

adee · 2010. Jún. 14. (H), 14.00
Sziasztok!

File (csv) megnyitásánál lehet valahogy szabályozni, hogy mettől meddig nyisson meg sorokat?
Pl 0-tól 1000-ig vagy 1001-től 2000-ig.
Több 10000 soros csv fileok importálásához lenne rá szükségem, mert nem tudja egyszerre feldolgozni a kb 120.000 soros filet. Gondoltam ajax-php párossal meg lehet valósítani, hogy mondjuk 1000 soronként importáljon így ne legyen php timeout. Ehhez mit szóltok?

Napi szinten lesz ilyenre szükségem, felhasználók bizonyos adatainak frissítésére (virtuális pontegyenleg csv alapján)

Elég sokat kerestem, pl php.net-en, de nem sikerült találni semmit, amivel a probléma megoldható lenne.

Előre is köszi.
 
1

Fileok?

janoszen · 2010. Jún. 14. (H), 14.31
Ha a soraid fix hosszúságúak, tudsz benne seekelni. Minden egyéb esetben sajnos végig kell olvasnod a fájlt és számolnod kell a sortöréseket. Javaslom, hogy ezt valami háttérfolyamatból (pl cronjobból) futtasd és akkor végig tudod futtatni az egészet.
2

set_time_limit

tisch.david · 2010. Jún. 14. (H), 15.28
Hali!

Állítsd be $subject függvénnyel, hogy mennyi ideig futhasson maximum a script. Ez nem jó?

Üdv:

Dávid
3

$subject függvény?

adee · 2010. Jún. 14. (H), 15.45
Nem igazán. Attól, hogy leállítom x idő után, még nem fogom tudni feldolgozni az egész csv-t. Hogy gondoltad?
4

:)

tisch.david · 2010. Jún. 14. (H), 15.53
Konkrétan arra gondoltam, hogy ha fél óráig tartana egy ekkora CSV feldolgozása, akkor kiadod a
set_time_limit(3600);
utasítást, így 1 óráig molyolhatsz vele timeout nélkül. Ez jó, vagy másra gondoltál?

Üdv:

Dávid
5

Lehet ...

vtsoftware · 2010. Jún. 14. (H), 17.19
...hülyeség, és/vagy félreértem a problémát. Egy ötlet... csak ötlet. Valószínű létezik ennél egyszerűbb megoldás is ;)

$kezdo_sor=1000;
$zaro_sor=2000;
$sorok=explode("\n", file_get_contents("sorok.csv"));
for($i=$kezdo_sor;$i<$zaro_sor;$i++)
{
  $adatok=explode(";", $sorok[$i]);
  echo $adatok[0]." - ".$adatok[1];
}
Max. annyival még lehetne csinosítani, hogy a $sorok változót nem töltöd fel az egész fájl tartalmával, hanem megadod hány KB-ig olvassa be a fájlt, de azt már az fopen, fread, fclose függvényekkel tudod megoldani.

MySQL-ben egyszerűbben és gyorsabban tudnád az adatokat kezelni.

Előre is elnézést ha félreértettem...
6

Memória

janoszen · 2010. Jún. 14. (H), 17.22
Ha elég nagy az a CSV fájl, akkor azért a memóriafogyasztásnak ez igen nagyon betesz mivel a PHP-s tömbök a szöveges méretük sokszorosát foglalják. Néhány száz kB-ig viszont ezzel a megoldással nem lesz gond.
7

Jogos...

vtsoftware · 2010. Jún. 14. (H), 17.32
Ez igaz.
Könyebben megúszná MySQL-ben, amit aztán bármikor lehet importálni, exportálni az adatbázisba.
8

fseek

Poetro · 2010. Jún. 14. (H), 18.06
<?php
$pointer = 0; // Eddig olvastuk be
// Megnézzük, hogy lementettük-e mar ezt az adatot.
if (is_readable('pointer.txt') && ($pointer_file = fopen('pointer.txt', 'r+'))) {
  fscanf($pointer_file, '%d', $pointer);
}
else if ($pointer_file = fopen('pointer.txt', 'w+')) {
  // Még nem volt mentes, kiírjuk a pointert
  fwrite($pointer_file, $pointer);
}
$limit = $pointer + 3000; // Legfeljebb addig olvasunk, amíg el nem hagyjuk a limitet.

// Megnyitjuk a CSV fájlunkat
if ($csv_file = fopen('data.csv', 'r')) {
  // Amennyiben volt pointer, odaugrunk a fájlban.
  if ($pointer) {
    fseek($csv_file, $pointer);
  }
  // Addig olvassuk a sorokat amíg vannak, vagy bele nem ütközünk a limitbe.
  while ($pointer < $limit && ($data = fgetcsv($csv_file, 1000, ';', '"'))) {
    $pointer = ftell($csv_file);
    // Csinálunk valamit az adatokkal
    print_r($data);
  }
  
  // Amennyiben sikerült mentenünk, frissítsük a fájlunkat.
  if ($pointer_file) {
    rewind($pointer_file);            // Elejére csavarunk...
    ftruncate($pointer_file, 0);      // ürítjük a fájlt...
    fwrite($pointer_file, $pointer);  // kiírjuk a pointert...
    fclose($pointer_file);            // bezárjuk a fájlt.
  }

  // Végül bezárjuk a CSV fájlunkat
  fclose($csv_file);
}
?>
9

Köszönöm!

adee · 2010. Jún. 16. (Sze), 11.23
Köszönöm, nagyon szépen működik!
10

Lehet, h buta megoldás, de..

EL Tebe · 2010. Jún. 21. (H), 12.58
.. hogy meddig futott le a cumó bepaszírozható egy sütibe és akkor folytatható onnan ahol megállt a progi. .
11

Böngésző

Poetro · 2010. Jún. 21. (H), 18.04
Már ha a dolog böngészőben fut, aminek azért kicsi az esélye. Inkább el tudom képzelni valami automatizált folyamat részeként. Másik dolog, ha valami miatt törlődött a COOKIE, akkor az importálás kezdődik előröl? Nem igazán használható.