dave635061: CSV Daten vergleichen

Hallo Leute,

ich hab da ein kleines (großes) Problem... Ich hab schon im Forumsarchiv gewühlt und auf selfphp geschaut.. kann aber so eine richtige Lösung nicht finden.... leider...
Also folgendes Problem

Ich habe 2 CSV Dateien,

rep.csv und repneu.csv

ich möchte nun mit fgetcsv die Daten auslesen... beider Dateien und miteinander vergleichen... wenn ein bestimmtes Feld übereinstimmt soll dieser Datensatz dann in eine neue Datei geschrieben werden die wir hier mal rep2.csv nennen wollen.

Leider funktioniert eine while in while-Schleife nicht.. war mein erster Gedanke... Vielleicht habt Ihr ne Lösung parat??? Ich weiß echt nicht mehr weiter... Dank Euch schon im vorraus...

Grüße Dave

  1. Moin!

    Also optimal sortierst Du beide Dateien vorher mit dem Systembefehl sort nach dem jeweiligen zu vergleichenden Feld.

    Dann liest Du die Dateien zeilenweise in getrennte Arrays ($a[z_nr][s_nr], $b[z_nr][s_nr] ein.

    Dann:

    Setze $Merker auf 0

    Baue eine Schleife (for $i=0...) über die Zeilen des ersten Arrays und eine zweite (for $k=$Merker...) über die Zeilen des zweiten Array's und vergleiche die entsprechenden Spalten.

    Bei Übereinstimmung:

    • Erzeuge den anzuhängenden String für die rep2.csv.
      (Denke an das "\n" oder "\r\n" für den Zeilenumbruch...)
    • Schreibe den Iterator in einen Merker (Falls Du sortiert hast).
    • Bei eindeutigen Schlüsseln (Das Feld in der zweiten Datei kann nicht mehrmals den selben Inhalt haben) setze $k auf die Abbruchbedingung  $k=count($b)
      Beende die erste Schleife:
      Beende die zweite Schleife.
      Füge den String an Deine rep2.csv an. (fopen, fwrite, fclose).

    Fertig.

    fastix®

    --
    Meinereinerselbst ist auf der Suche nach Aufträgen
    1. rehuhu...

      Also ich weiß ni ich bin zu blöd heut.... Ich steig nich ganz dahinter...

      Also um ne Datei auszulesen muss ich doch mit ner while-schlefe arbeiten... while (fgetcsv.... )

      so da les ich die erste Datei ein und erzeug folgendes array:

      $zeile1=array($rowneu=>array($neu[0],$neu[1],$neu[2],$neu[3],$neu[4],$neu[5]));

      so das selbe dann mit der zweiten datei... wobei die Variable zeile2[..][] heißt...

      so und nu komm ich nicht weiter...

      Genau an de Stelle hackt es bei mir... leider... :-(

      Kannst mir nochma Starthilfe geben... bei mir steht heut echt einer auf der Leitung... sorry das ich Euch so auf den Wecke gehe...

      gruß Dave

      1. Moin!

        Oh Gott!

        Es geht doch recht einfach und zu Fuß mit:

        $dateiname="/pfad/zu/file.csv"
        $fp=fopen($dateiname,"r")
        $datei=fread ($fp, filesize($dateiname));

        $datei=str_replace("\r","",$datei_1);
        #Bei Dateien aus Windows die "\r" entfernen

        $datei=array explode("\n",$string);

        zerlegt am Zeilende, es entsteht ein Array.

        for ($i=0; $i<count($datei_1) {
          # den gehen wir durch...
          $datei[$i]=explode(";",$datei[$i]);
          # Wir trennen am Semikolon. Nimm was anderes, wenn Du was anderes als Trenner hast... CSV!=CSV
        }

        jetzt hast Du sowas wie: $datei[1][2] enthält das dritte Datenfeld des zweiten Datensatzes nach menschlicher Zählung...

        Übrigens: denke an die Speicherbegrenzung. Ist absehbar, dass dies alles mal größer werden _könnte_ brauchst Du eine Datenbank. Performant ist das auch nicht unbedingt.

        fastix®

        --
        Meinereinerselbst ist auf der Suche nach Aufträgen