Daten vergleichen

  • geschlossen

  • katzentreiber
  • 8031 Aufrufe 7 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Daten vergleichen

    Hallo, hoffe hier kann mir jemand helfen.
    Eigentlich "dachte" ich ne einfache Aufgabe.

    Ich habe zwei .csv Dateien mit unterschidlichem Inhalt und möchte eine Ausgabe, welche Daten von Datei 1 in Datei 2 fehlen.

    PHP-Quellcode

    1. $datei1 = "../pflichtwerkzeuge.csv"; // Name der Pflicht-Werkzeugdatei
    2. $datei2 = "liste.csv"; // Name der eigenen Werkzeugdatei
    3. $array1 = file($datei1); // Datei in ein Array einlesen
    4. $array2 = file($datei2); // Datei in ein Array einlesen
    5. foreach ($array1 as $suchbegriff)
    6. {
    7. //echo $suchbegriff . " - Suchbegriff<br>" ; // Inhalt zum testen ausgeben
    8. $result = array_diff ( $array2, $array1 );
    9. while ( list ( $key, $val ) = each ( $result ) )
    10. {
    11. echo $key . ': ' . $val . '<br>';
    12. }
    13. }
    Alles anzeigen


    Da funktioniert soweit und auf der Seite wird jeweils der Suchbegriff ausgegeben. Eigentlich ist Datei2, in der ich suchen will ja in array2 enthalten und ich kann den Inhalt auch mit echo sehen. Aber gefunden wird nicht.

    Es soll so werden, das ich die in $datei2 fehlenden Inhalte auf den Bildschirm ausgebe oder in eine Datei schreibe um sie mit include auf den Bildschirm zu holen und drucken zu können.
    In meinem Leichtsinn dachte ich ja ist ganz einfach mit array_diff() zu bewerkstelligen, aber das Ergenis bleibt immer gleich, er Zeigt immer alle Inhalte an, auch die gleichen...

    Hoffe auf eure Ideen und Hilfe,

    :danke:
    es grüßt der katzentreiber

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Broken Sword () aus folgendem Grund: Unnützes Bild und Smilies entfernt

  • Kann es sein, dass du nicht richtig gelesen hast, was array_diff eigentlich tut?

    PHP: array_diff - Manual

    Return Values

    Returns an array containing all the entries from array1 that are not present in any of the other arrays.


    mit

    PHP-Quellcode

    1. $result = array_diff ( $array2, $array1 );
    würde er nur das auflisten was zwar in array2 vorkommt, aber nicht in array1.

    Meintest du nicht eher

    PHP-Quellcode

    1. $result = array_diff ( $array1, $array2 );

    ?

    Die foreach-Schleife steht da nur wegen des Debuggings nehm ich an?
    "General, der Mensch ist sehr brauchbar. Er kann fliegen und er kann töten.
    Aber er hat einen Fehler: Er kann denken." - Brecht
    I Don't smoke, I don't drink, I don't fuck! At least I can fucking think!
  • Hi undeath,
    upps -

    PHP-Quellcode

    1. $result = array_diff ( $array1, $array2 );

    ist natürlich richtig und so vergleicht er auch. Aber er vergleicht anscheinend den Index mit und nur wenn der gleich ist, lässt er es als unterschied aussen vor und schreibt es nicht mit in die Liste...

    Ich suche eine Möglichkeit, Nummern der 1. Liste in der zweiten zu suchen und nur die fehlenenden auszugeben.
    Wird wohl nichts weiter übrig bleiben, als jede Numnmer einzeln in der Datei zu suchen und bei vorhandensein zu ignorieren und bei fehlen in eine neue Liste zu schreiben.
    Ich hoffe, ich kriege das hin, dafür war auch die Schleife gedacht, war mein 1. Ansatz, biss ich den array_diff Befehl gesehen habe.

    Bin eigentlich kein Programmierer und habe mir alles "erlesen" und so nen Werkzeugmanager gebaut. www.werkzeugmanager.com, und suche jetzt noch die Möglichkeit, die vorhandenen Werkzeuge mit den Pflichwerkzeugen abzugleichen, ohne jede Nummer von Hand einzutippen...

    Bin für jede Hilfe dankbar.

    :danke:
    es grüßt der katzentreiber

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Broken Sword () aus folgendem Grund: unnützes Bild/Smilies entfernt

  • Hi,
    der Index wird bei array_diff nicht beachtet. Stell sicher, dass die beiden Dateien gleich aufgebaut sind.
    Mein Verdacht ist, dass die eine Datei mit \n endet und die andere mit \r\n.
    probiere mal array_map('trim',file($datei1)); und array_map('trim',file($datei2)); einzubinden.
    Das würde meinen Verdacht prüfen.

    Gruß
    Broken Sword

    P.S.
    Bitte halte dich mit unnützen blinke-Bildchen/Smilies zurück.
    Auf dem Abstellgleis sah man ihn liegen,
    Auf dem Abstellgleis zwischen Schwelle und Gestein,
    Auf dem Abstellgleis im strömenden Regen,
    Auf dem Abstellgleis allein.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Broken Sword ()

  • Hi Broken Sword,
    trim hilft auch nicht, ich habe extra genau gleiche Dateien erstellt und da klappt es auch, wenn die Dateien den gleichen Inhalt haben.
    Da aber normal die Daten nicht an der gleichen Stelle - sprich Zeilenummer - stehen, ist es für array_diff wieder ein Unterschied.


    Ich habe das gleiche jetzt mit in_array probiert:

    PHP-Quellcode

    1. $x = $HTTP_GET_VARS['action'];
    2. if ($x=="suchen") {
    3. $suchbegriff = $_POST['suchbegriff'];
    4. $db = $_POST['db'];
    5. $dateivw = "../vwpflicht.csv";
    6. $dateiaudi = "../audipflicht.csv";
    7. $dateiskoda = "../shodapflicht.csv";
    8. $dateiseat = "../seatpflicht.csv";
    9. $eigene = 'liste.csv';
    10. $array1 = file($db); // Datei in ein Array einlesen
    11. $array2 = file($eigene); // Datei in ein Array einlesen
    12. array_map('trim',$array1);
    13. array_map('trim',$array2);
    14. echo 'Info: suchen ist an, Verwendete Datenbank lautet '; //zum testen anschalten
    15. echo $db . "<br><br>"; //zum testen anschalten
    16. foreach ($array1 as $suchbegriff)
    17. {
    18. if ( in_array ( $suchbegriff, $array2 ) )
    19. {
    20. echo $suchbegriff . 'gefunden!' . "<br>";
    21. }
    22. if ( ! in_array ( $suchbegriff, $array2 ) )
    23. {
    24. echo $suchbegriff . 'nicht gefunden!<br>';
    25. }
    26. } }
    27. exit;
    Alles anzeigen



    Funzt aber auch nur, wenn die Daten in der gleichen Zeilennummer stehen. Sonst steht überall "nicht gefunden".

    Ich brauche eine Schleife, die Zeile für Zeile (pro Zeile nur eine ca 5 stellige Nummer) aus der einen Datei mit den Einträgen in der anderen Datei (wieder pro Zeile eine ca 5 stellige Nummern) vergleicht und die fehlenden Nummern ausgibt. Dabei müssen alle Nummern der ersten Datei mit allen Nummern der zweiten Datei verglichen werden. Ich kriegs irgendwie nicht hin. Mein Latain ist ziemlich am Ende...:read:
    Wäre super, wenn mir das jemand zusammenbauen könnte
    :danke: im Voraus
    -
    es grüßt der katzentreiber
  • Probiere mal

    PHP-Quellcode

    1. $x = $HTTP_GET_VARS['action'];
    2. if ($x=="suchen") {
    3. $suchbegriff = $_POST['suchbegriff'];
    4. $db = $_POST['db'];
    5. $dateivw = "../vwpflicht.csv";
    6. $dateiaudi = "../audipflicht.csv";
    7. $dateiskoda = "../shodapflicht.csv";
    8. $dateiseat = "../seatpflicht.csv";
    9. $eigene = 'liste.csv';
    10. $array1 = array_map('trim',file($db)); // Datei in ein Array einlesen
    11. $array2 = array_map('trim',file($eigene)); // Datei in ein Array einlesen
    12. var_dump(array_diff($array1,$array2));
    Alles anzeigen


    Gruß
    Broken Sword
    Auf dem Abstellgleis sah man ihn liegen,
    Auf dem Abstellgleis zwischen Schwelle und Gestein,
    Auf dem Abstellgleis im strömenden Regen,
    Auf dem Abstellgleis allein.
  • Hi Broken Sword,
    super - funzt jetzt - vielen vielen Dank.
    Es kann so einfach sein. :depp:
    Lag am einlesen der Arrays

    PHP-Quellcode

    1. $array1 = array_map('trim',file($db)); // Datei in ein Array einlesen
    2. $array2 = array_map('trim',file($eigene));


    :bing::bing::bing::bing::bing:
    es grüßt der katzentreiber