Datei blockweise auslesen??
Michael
- php
Hallo!
$dat = file("datei.txt");
Ich muss eine csv Datei in eine Datenbank migrieren. Dazu schreibe ich mir die Datei 'datei.txt' in ein array und importiere zeilenweise. Das klappt an sich auch.
Problem:
Die Datei hat 800.000 Zeilen! $dat wird mit dieser Variante einfach zu gross, da spielt der Speicher nicht mehr mit!
Meine Idee: Ich lese die Datei blockweise ein, also zuerst die Zeilen 1-100, dann die Zeilen 101-200 usw...
Wie mache ich das?? Irgendwie mit fgets()? Brauche also einen Mechanismus, der mir von 800.000 Zeilen nur zb. Zeile 500 bis Zeile 600 zurückgibt!
Für Hilfe wäre ich superdankbar!!!!
schönen Sonntag noch,
michael
Hallo Michael,
Wie mache ich das?? Irgendwie mit fgets()? Brauche also einen Mechanismus, der mir von 800.000 Zeilen nur zb. Zeile 500 bis Zeile 600 zurückgibt!
Für den Computer gibt es erst einmal keine Zeilen, daher kann er ohne Nachzuschauen nicht wissen, wo eine Anfängt und die andere Aufhört.
Aber wenn Du CSV-Dateien auslesen willst, dann hilft Dir vielleicht http://php3.de/manual/de/function.fgetcsv.php weiter.
schönen Sonntag noch,
Ebenfalls,
Christian
Aber wenn Du CSV-Dateien auslesen willst, dann hilft Dir vielleicht http://php3.de/manual/de/function.fgetcsv.php weiter.
danke, die funktion kannte ich noch nicht, löst aber leider mein problem nicht! auch hier werden alle zeilen auf einmal via count() ausgelesen und in eine variable geladen. das würde wieder meinen speicher sprengen! ich brauche eben die möglichkeit nur eine bestimmte anzahl von zeilen (zb. 100) irgendwo aus der mitte der datei in eine variable zu stecken!
dankeschön!
Hallo Michael,
Aber wenn Du CSV-Dateien auslesen willst, dann hilft Dir vielleicht
http://php3.de/manual/de/function.fgetcsv.php weiter.danke, die funktion kannte ich noch nicht, löst aber leider mein problem
nicht! auch hier werden alle zeilen auf einmal via count() ausgelesen und
in eine variable geladen. das würde wieder meinen speicher sprengen! ich
brauche eben die möglichkeit nur eine bestimmte anzahl von zeilen (zb.
100) irgendwo aus der mitte der datei in eine variable zu stecken!
Wieso? Das count() im Beispiel bezieht sich nur auf die einzelnen Spalten.
Du kannst prinzipiell nicht in der Mitte einer Datei einfach ein paar Zeilen
rauslesen, ohne nicht alles vorher gelesen zu haben. Was hindert Dich aber
daran, folgendes zu tun:
while ($data = fgetcsv(...)) {
/* ok, jetzt haben wir eine Zeile, die steht in $data */
fuege_in_datenbank_ein ($data);
}
Somit bearbeitest Du eine Zeile nach der anderen. Du brauchst natürlich
nicht fgetcsv zu nehmen, fgets zum einlesen einer Zeile funktioniert analog.
Wenn Du eine bestimmte Zeile auslesen willst, dann musst Du hochzählen:
$start = 200; /* startzeile */
$ende = 300; /* endzeile */
$ergebnis = array (); /* da kommt alles rein */
$zeile = 1;
while ($data = fgetcsv(...)) {
/* mal schauen */
if ($zeile >= $start && $zeile <= $ende) {
$ergebnis[] = $data;
}
if ($zeile > $ende) {
/* nachdem wir jetzt sowieso hinter dem Ende sind,
brauchen wir auch nichts mehr auszulesen
daher: stopp */
break;
}
$zeile++;
}
Dann stehen in $ergebnis die Zeile 200 - 300.
Jetzt nur mal vom Ansatz her...
Grüße,
Christian