CSV mit über 30.000 Zeilen einlesen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • CSV mit über 30.000 Zeilen einlesen

    Hallo

    Mein Problem ist folgendes.

    Ich bekomm täglich eine CSV Datei mit über 30.000 Zeilen. Diese muss in eine MySQL Datenbank übertragen werden. Wobei schon vorhandene Datensätze aktualisiert und neue erstellt werden.

    Das läuft auch weiter ohne Probleme.

    Doch nach ca. 10.000 Zeilen ist schluss, ohne weitere Fehlermeldung. Ich denke mal das es an einem Timeout liegt.

    Derzeit teile ich die CSV in drei bis vier Teile und umgehe dieses Problem. Doch das ist keine ideale Lösung.

    Wie kann ich erreichen das ich die CSV komplet in einem rutsch abarbeiten kann?

  • #2
    wie ließt du den die datei ein?

    ich machs mit:
    PHP-Code:

    $lines 
    file ($allg[adressdatei]);
    foreach (
    $lines as $line_num => $line) {
    $spalte explode(";"$line);
    ...

    Kommentar


    • #3
      Da ich jede Zeilen abarbeiten muss lese ich über fgetcsv ein

      PHP-Code:
      while(($row fgetcsv ($daten,$dateigroesse,';'))!=false
      Und in der Schleife durchlaufe ich dann alle Operationen.

      Wie z.B. Abgleich mit der Datenbank ob der Datensatz schon existiert etc..

      Dann werden die Daten in der DB aktualisiert oder neu eingetragen.
      Die DB verfügt über mehrere Tabellen welche sowohl bei den Abfragen als auch beim schreiben angesteuert werden.

      Kommentar


      • #4
        Ich vermute das die Ausführungszeit deiner Scripte einfach zu kurz ist.

        http://de.php.net/manual/de/function.set-time-limit.php

        Kommentar


        • #5
          Nehmen wir an ich könnte die set_time_limit aufgrund der Einstellungen nicht nutzen. (Muss es eventuell noch an einen anderen Server anpassen).

          Was dann?

          Kommentar


          • #6
            Aus: http://de2.php.net/manual/de/functio...time-limit.php

            ---
            Achtung: Wenn PHP im Safemode läuft, hat set_time_limit() keinen Effekt. Die einzige Möglichkeit, dies zu umgehen, ist den Safemode im configuration file auszuschalten.
            ---


            Wenn die Ausführungszeit dein Problem ist, dann solltest du darüber nachdenken das Script auf einem Server laufen zu lassen der nicht im Safe-Mode ist, oder entsprechend konfiguriert.


            Liegt es denn überhaupt an der ausführungszeit?

            Kommentar


            • #7
              Ich denke schon das es ein timeout ist. Aber sicher kann ich es nicht sagen.
              Das Script läuft einige Minuten.

              Und gibt mir zur Kontrolle immer die aktuelle Zeilennummer aus. Doch nach ca. 10.000 Zeilen ist dann halt schluss.

              Gibt es eine möglichkeit mit der ich die csv quasi intern zerlegen kann und das sich das Script dann nach einer Gewissen menge Zeilen selbst wieder aufruft und dort weitermacht wo es aufgehört hat?

              Das müsste doch ein eventuelles timeout umgehen oder?

              Kommentar


              • #8
                Hast du das Time Limit mal auf 10Minuten gesetzt und geschaut, ob es dann durchläuft?

                Kommentar


                • #9
                  Es läuft derzeit auf angemietetem Webspace.

                  Und ich kenne mich mit der Configuration von PHP nicht wirklich aus, aber ich kann den doch in dem Falle nicht selbst abändern - oder?

                  Kommentar


                  • #10
                    Bist du meinem Link zu der Funktion set_time_limit() gefolgt? 4 Posts weiter oben?

                    Kommentar


                    • #11
                      ja ich habe mir die Funktionsweise von set_time_limit() angeschaut warum?

                      Kommentar


                      • #12
                        Das Timeout kann man auch durch einen Selbstaufruf überlisten.
                        Man muss sich nur merken an welcher Stelle der DAtei man war.

                        Ungefähr so klappts:
                        PHP-Code:
                        <?php
                        $offset
                        =(empty($_GET['offset'])) ? 0$_GET['offset'];
                        $dateiname="./import/data.csv";

                        $f=fopen($dateiname,"r");
                        if (
                        $f===false) die("Konnte Datei nicht finden oder öffnen!");
                        fseek($f,$offset);
                        $feld=fgetcsv($f,4096,";"); // Feldtrenner
                        $fertig=false;

                        if (!
                        feof($f)) 
                        {
                            
                        $offset=ftell($f); // merken wie weit die Abbarbeitung vorangeschritten ist
                            // Daten prüfen und gegebenenfalls verändern - $feld[0]=erste Spalte aus der CSV-Datei
                            
                        if ($feld[0]==""$feld[0]=0;
                            ...
                            
                        // Jetzt Query basteln und dann Eintrag in die Datenbank
                            
                        ...
                        }
                        else 
                        $fertig=true;
                        fclose($f);    

                        if (
                        $fertig) die("<br>Import beendet.<br><br>Ende der Datei");

                        if (!
                        $fertig)
                        {
                            echo 
                        "<script =\"javascript\">self.location=\"$PHP_SELF?offset=".$offset;
                            echo 
                        "\"</script>";
                        }
                        ?>
                        Jetzt noch das Auslesen in eine Schleife packen und hübsch gegen eine Maxanzahl von Einträgen oder die vergangene Zeit gegen die max_execution_time prüfen und fertig ist die universal CSV-Importroutine, die auf jedem Server läuft.
                        Zuletzt geändert von DSB; 30.01.2006, 08:03.

                        Kommentar


                        • #13
                          Vielen Dank das ist genau was ich gesucht habe!!!!

                          Kommentar

                          Lädt...
                          X