Martin Franz: Abbruch bei CSV-Verarbeitung

Hallo,

ich lese auf einer Webseite verschiedene hoch geladene CSV-Dateien ein, wobei mir jetzt bei einer größeren Datei der Feheler ausgefallen ist, dass es durch die Verarbeitung auf dem Server sehr lange dauert und letztendlich nur eine weiße Seite angezeigt wird.
Was kann das sein? Was kann ich dagegen tun?

  1. Moin

    Was ich hier mache? Ich schätze... Ich schätze mal du hast nen Fehler in der Programmierung, was ich aber ohne Code nicht genau bestimmen kann.

    Error-Reporting solltest du mal anschalten, damit du die Fehler angezeigt bekommst.

    Und verdammt nochmal: Wir sind keine Hellseher.

    Gib uns Code und dir werde geholfen.

    Gruß Bobby

    --
    -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
    -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
    ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
    1. Danke! Du hattest Recht!
      Ich hab das Error-Reporting eingeschaltet und es kommen wirklich Fehlermeldungen. Ich werd gleich mal nach der Ursache schauen.

      1. Ich hab den Fehler gefunden und korrigiert, aber leider erschien jetzt wieder die weiße Seite ohne Fehlermeldung diesmal. Nachfolgend ist die Schleife in der ich die Datensätze durchlaufe:

        //Datensätze durchlaufen
        for($i=0; $i<count($lines); $i++)
        {
         if($count > 1)
         {
          //Aktuelle Zeile einlesen
          $zeile = $lines[$i];
          $zeile = trim($zeile);
          $zeile = str_replace(""", "", $zeile);
          $zeile = str_replace("\r\n","",$zeile);

        if(strlen($zeile) > 0)
          {
           //Einzelne Datenfelder auftrennen und speichern
           $zeileData = explode(";", $zeile);

        if(count($zeileData) == 14)
           {
            $Titel     = $zeileData[0];
            $Name     = $zeileData[1];
            $Vorname   = $zeileData[2];
            $PLZ     = $zeileData[3];
            $Ort     = $zeileData[4];
            $Strasse    = $zeileData[5];
            $Hausnummer    = $zeileData[6];
            $Geburtsdatum   = $zeileData[7];
            $Geburtsdatum   = str_replace($Geburtsdatum, "*", "");
            $gebDateParts = explode(".", $Geburtsdatum);
               if(count($gebDateParts) == 3)
               {
                if(strlen($gebDateParts[2]) == 2)
                {
                 $gebDateParts[2] = "19".$gebDateParts[2];
                 $Geburtsdatum  = $gebDateParts[0].".".$gebDateParts[1].".".$gebDateParts[2];
                }//if
               }//if
               else
                $Geburtsdatum = "01.01.1970";
               $Geburtsdatum   = date("Y-m-d 00:00:00", strToTime($Geburtsdatum));
               $Beruf     = $zeileData[8];
               $Telefon    = $zeileData[9];
               $Handy     = $zeileData[10];
               $Email     = $zeileData[11];
               $Einlagehoehe   = $zeileData[12];
               $Fondsklassifizierung = $zeileData[13];

        //Prüfen, ob nachfolgende Datensätze noch zum letzten Feld dieses Datensatzes gehören
               for($h=$i+1; $h<count($lines); $h++)
               {
                $nextLine = $lines[$h];
                $nextLine = trim($nextLine);
                $nextLine = str_replace(""", "", $nextLine);
                $nextLine = str_replace("\r\n","",$nextLine);

        $semikolonExists = strpos("_".$nextLine, ";");

        if(!$semikolonExists) //wenn ; nicht enthalten ist
                {
                 //nextLine an letzte Zeile des aktuellen Datensatzes anfügen
                 $Fondsklassifizierung .= " ".$nextLine;

        //Array-Feld an dem sich in dem nextLine enthalten ist leeren
                 $lines[$h] = "";
                }//if
                else
                 break;
               }//for

        //Connection erneuern
               $db  = new DatabaseHandling();
               $conn = $db->GetConnection();

        //Daten maskieren
               $Titel     = mysql_real_escape_string($Titel, $conn);
               $Name     = mysql_real_escape_string($Name, $conn);
               $Vorname    = mysql_real_escape_string($Vorname, $conn);
               $PLZ     = mysql_real_escape_string($PLZ, $conn);
               $Ort     = mysql_real_escape_string($Ort, $conn);
               $Strasse    = mysql_real_escape_string($Strasse, $conn);
               $Hausnummer    = mysql_real_escape_string($Hausnummer, $conn);
               $Beruf     = mysql_real_escape_string($Beruf, $conn);
               $Telefon    = mysql_real_escape_string($Telefon, $conn);
               $Handy     = mysql_real_escape_string($Handy, $conn);
               $Email     = mysql_real_escape_string($Email, $conn);
               $Einlagehoehe   = mysql_real_escape_string($Einlagehoehe, $conn);
               $Fondsklassifizierung = mysql_real_escape_string($Fondsklassifizierung, $conn);

        //Prüfen, ob Eintrag bereits vorhanden
               $sql = sprintf("SELECT COUNT(ID) FROM poolkontakte WHERE Titel='%s' AND Name='%s' AND Vorname='%s' AND PLZ='%s' AND Ort='%s' AND Strasse='%s' AND Hausnummer='%s' AND Telefon='%s'", $Titel, $Name, $Vorname, $PLZ, $Ort, $Strasse, $Hausnummer, $Telefon);
               $anzahl = $db->ExecuteSqlSingleReturn($sql);
               if($anzahl == 0)
               {

        $sql = sprintf("INSERT INTO poolkontakte SET B2B_Kontakt=0, BereitstellerID=%s, Titel='%s', Name='%s', Vorname='%s', PLZ='%s', Ort='%s', Strasse='%s', Hausnummer='%s', Geburtsdatum='%s', Beruf='%s', Telefon='%s', Handy='%s', Email='%s', Einlagehoehe='%s', Fondsklassifizierung='%s'", $bereitstellerID, $Titel, $Name, $Vorname, $PLZ, $Ort, $Strasse, $Hausnummer, $Geburtsdatum, $Beruf, $Telefon, $Handy, $Email, $Einlagehoehe, $Fondsklassifizierung);

        $sqltest = $sql;
                $db->ExecuteSqlNoReturn($sql);
                $neu++;

        //Felder leeren
                $Titel     = "";
                $Name     = "";
                $Vorname    = "";
                $PLZ     = "";
                $Ort     = "";
                $Strasse    = "";
                $Hausnummer    = "";
                $Geburtsdatum   = "";
                $Beruf     = "";
                $Telefon    = "";
                $Handy     = "";
                $Email     = "";
                $Einlagehoehe   = "";
                $Fondsklassifizierung = "";

        }//if
               else
                $doppelt++;

        $anzahl = 0;
              }//if
              else
              {
               $feldAnzahlFalsch++;

        //Fehlerhafte Datensätze in Datei speichern
               $csverr_filepath = sprintf("csv/%s", $csverr_filename);

        //Dateiheader
               if(!$headerWrote)
               {
                $this->WriteLine($csverr_filepath, "Titel;Name;Vorname;PLZ;Ort;Straße;Hausnummer;Geburtsdatum;Beruf;Telefon Festnetz;Telefon Handy;E-Mail;Einlagehöhe;Fondsklassifizierung");
                $headerWrote = true;
               }//if

        //Fehlerhaften Datensatz schreiben
               $this->WriteLine($csverr_filepath, $zeile);

        }//else
             }//if
            }//if
            else
            {
             //Prüfen der Headerzeile
             $zeile  = $lines[$i];
             $zeile  = trim($zeile);
             $zeile  = str_replace(""", "", $zeile);
             $zeile  = str_replace("\r\n","",$zeile);

        if($zeile != "Titel;Name;Vorname;PLZ;Ort;Straße;Hausnummer;Geburtsdatum;Beruf;Telefon Festnetz;Telefon Handy;E-Mail;Einlagehöhe;Fondsklassifizierung")
             {
              $errorMessage = "Die Feldnamen oder Feldreihenfolge in der Datei sind falsch. Prüfen Sie bitte die Datei.";
              break;
             }//if
            }//else

        $count++;
           }//for

        1. Hallo Martin,

          hast Du schon mal etwas von Kommentaren und Dokumentation gehört?
          Separate Funktionsbeschreibung würde es für den Anfang vielleicht auch noch tun.

          Und dann soll es in PHP auch benutzerdefinierte Funktionen geben, habe ich mal gehört :-)

          Teile also die Aufgaben in abgrenzbare Funktionen auf, prüfe diese einzeln in einer isolierten Testumgebung, baue dann daraus das Programm zusammen. Wenn es immer noch nicht läuft, kannst Du zwischen den Funktionsblöcken Kontrollausgaben einbauen. Du weißt dann schließlich schon, dass die Funktionen alleine funktionieren und was sie wann als Ergebnis liefern müssten.

          Und komm nicht auf die Idee zu sagen, dass Dir diese Vorgehensweise zu kompliziert ist.
          Was willst Du erst machen, wenn Deine Programme mehrere 10K groß werden?

          LG
          Chris©

          1. Hallo Chris.
            Danke für die Tipps, aber nutzlos. Zu kompliziert ist es mir bei weitem nicht, und die einzelnen Bereiche funktionieren einwandfrei. Das Problem ist ja eben der Zusammenhang von allen Bereichen. Der Fehler tritt bei einer Datei mit 100 Datensätzen nicht auf, bei einer Datei mir 5600 aber schon.

            1. Moin

              Danke für die Tipps, aber nutzlos. Zu kompliziert ist es mir bei weitem nicht, und die einzelnen Bereiche funktionieren einwandfrei. Das Problem ist ja eben der Zusammenhang von allen Bereichen. Der Fehler tritt bei einer Datei mit 100 Datensätzen nicht auf, bei einer Datei mir 5600 aber schon.

              Nutzlos sind die keineswegs.

              Gib zwischen den Funktionen/Schleifen oder in bestimmten Bereichen der Funktionen/Schleifen Kontrollausgaben aus, um zu testen, welche Schleifen angesprochen werden, und welche ein Ergebnis liefern.

              Nur SO kannst du den Aufbau deines Programmes kontrollieren. und die Stelle herausfinden, an dem leere VAriablen geschrieben werden, oder wo es bei deiner Programmlogik hackt.

              Gruß Bobby

              --
              -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
              -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
              ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
              1. Moin

                bei einer Datei mir 5600 aber schon.

                Sorry, hat ich überlesen.

                Dann überprüfe die Datei nach ungültigen Werten oder setze das memory-limit (soweit vom provider erlaubt) mal hoch.

                Wie öffnest du die CSV? Schon mal was von der funktion fgetcsv() gehört? Wird das Timelimit das vom Server für die Verarbeitung von Scripten gesetzt ist mit deinem Script überschritten?

                Du siehst, es gibt noch genügend zu prüfen.

                Gruß Bobby

                --
                -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
                -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
                ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
                1. Hellihello

                  bei einer Datei mir 5600 aber schon.

                  Oder aber mal 2500 nehmen, oder aber mal 5000 bestehend aus bereits getesteten, zb 5000 mal die erste Zeile, die funktioniert (oder 10 mal die 500, die funktionieren).

                  Dank und Gruß,

                  frankx

                  --
                  tryin to multitain  - Globus = Planet != Welt