Michael: Datei blockweise auslesen??

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

  1. 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

    --
    Sollen sich alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen und nicht mehr davon erfasst haben als eine Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst.
                          -- Albert Einstein
    1. 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!

      1. 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

        --
        Sollen sich alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen und nicht mehr davon erfasst haben als eine Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst.
                              -- Albert Einstein