Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit while (!feof($handle))

Einklappen

Neue Werbung 2019

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

  • Problem mit while (!feof($handle))

    Hallo Leute,

    habe ein Problem mit der der „while (!feof($handle))“ – Schleife. Ich versuche eine.csv Datei zeilenweise einzulesen, dies klappt auch so wie ich es möchte. Aber bei einer bestimmte Datei mit ca. 8000 Zeilen hängt sich die Schleife auf.

    Die Erhöhung von "fgetcsv($handle, 1000, ",");" habe ich auch schon ausprobiert.

    Sobald ich "while (!feof($handle))" mit mehreren manuellen Ausgaben ersetze, funktioniert es wieder wie gewohnt.

    Verstehe nicht ganz an was es liegt, hier mein vereinfachter Codeschnipsel:

    PHP-Code:
                // auf die csvDatei zugreifen
                
    $handle fopen($this->RemoteServerDetails->getLocalDir(), "r");

                
    // erste Zeile überspringen
                
    fgetcsv($handle1000",");
                
    // Prüft, ob der Dateizeiger am Ende der Datei steht.
                
    while (!feof($handle)) {
                    
    $arrayZeileAktuellLieferant fgetcsv($handle1000",");
                    
                    
    // do something
                
                
    }

                
    fclose($handle); 
    Kann einer vielleicht helfen?

  • #2
    feof() hat einige Tücken, siehe Warnungen im Manual. Den Rückgabewert von fgetcsv() genauer anzuschauen bevor dieser verarbeitet wird und bei Fehlern/Dateiende sich mit einem break aus der Schleife zu verabschieden ist zu empfehlen.
    Sind aber alles nur Vermutungen, viel mehr kann bei einem vereinfachten Codeschnipsel nicht sagen.

    Kommentar


    • #3
      Vielen Dank für deine Antwort. Ich habe den Grund gefunden, denn sobald ich die Datei auf ca. 1000 Zeilen reduziere, läuft das ganze durch. Es liegt also an der 30 Sekunden Grenze (Time-Out).

      Ich habe zwei .csv Dateien die ich mit einander vergleiche. Ich vergleiche Sie ganz normal also alles mit allem, somit muss ich die zweite Datei mehrmals durchgehen. Gibt es eine effizientere Lösung um das Ganze zu lösen? Mit array_intersect_assoc oder ähnlichem?

      So sehen meine beiden Dateien aus:

      csv_1:
      EAN-Nummer;Artikel;Lager;......
      csv_2
      Artikelname;Bestelnummer;EAN;.....

      Vergleichen will ich eigentlich nur die EANs und daraufhin das Lager auslesen falls die EANs übereinstimmen.

      Kommentar


      • #4
        Aber bei einer bestimmte Datei mit ca. 8000 Zeilen hängt sich die Schleife auf.
        It's time to say hello to databases

        Erstelle aus Deinen CSV-Dateien zwei Tabellen in einer Datenbank.
        Hierzu musst Du ja nicht zwingend MySQL, PostgreSQL o.ä. verwenden. Ein einfaches sqlite reicht für Deine Zwecke:
        Code:
        csv_table_1:
        EAN|Artikel|Lager...
        
        csv_table_2
        Artikelname|Bestellnummer|EAN...
        Code:
        'mögliche Lösung über SQL
        
        SELECT
            `tbl1`.`EAN`,
            `tbl1`.`Lager`
        
        FROM
            `csv_table_1` tbl1
        JOIN
            `csv_table_2` tbl2 ON `tbl1`.`EAN` = `tbl2`.`EAN`
        Ein einfaches Anwendungsbeispiel sähe unter Verwendung von PDO so aus:
        PHP-Code:
        // Verbindung herstellen mit der Datenbankdatei
        $oDB = new PDO'sqlite:databaseFileName.sqlite' );

        // unter Annahme, daß $sSqlQuery die obige Anweisung enthält:
        $oDBStatement $oDB->prepare$sSqlQuery );
        $oDBStatement->execute();

        // nur der Kürze halber alle Datensätze fangen:
        $aDataSetRows $oDBStatement->fetchAllPDO::FETCH_OBJ );

        // Kontrollausgabe:
        var_dump$aDataSetRows ); 
        Damit hast Du alle EAN's mit entsprechenden Lagern.
        Competence-Center -> Enjoy the Informatrix
        PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

        Kommentar


        • #5
          Ist das bei 8000 Zeilen den wirklich notwendig? Und würde das importieren in die Datenbank nicht länger dauern als wenn ich diese Daten mit PHP durchgehe?

          Kommentar


          • #6
            Ich weiß ja nicht, woher die Daten kommen und kann schwerlich beurteilen, ob das vom Aufwand sinnvoll ist, Performance seitig liegst Du aber mit ner DB vorne!
            Competence-Center -> Enjoy the Informatrix
            PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

            Kommentar

            Lädt...
            X