vergleichen von Dateiinhalten

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

  • vergleichen von Dateiinhalten

    Hallo...

    Ich bin gerade dabei ein Script zu schreiben, und komme an einer Stelle nicht mehr weiter.
    Die Ausgangssituation ist folgende:
    Ich habe zwei CVS Dateien.
    Die erste ist eine Banliste für einen Gameserver, die eindeutige IDs von Usern enthält die gebannt wurden.
    Die zweite Datei, enthält Informationen zu allen Usern, die jemals auf dem Gameserver eingeloggt waren, unter anderem auch die ID.
    Ziel ist es nun, die Userliste nach den gebannten IDs zu durchsuchen, und bei übereinstimmung die jeweilige Zeile des Users in eine separate Datei zu speichern.

    Ich habe das Script bisher soweit, das ich mir die jeweiligen Dateien vom Server kopiere, und sie anschließend "aufbereite". Das heist, das die ID jeweils an erste Stelle steht, und überflüssige Informationen aus der Liste gefilter werden. Nun kommen die Arrays ins spiel, und da gehts nicht weiter.
    Bisher hab ich das so gemacht (ohne Ergebnis):

    PHP-Code:
    $banlist_content file("$banlist");
    $ranklist_content file("$ranklist");

    $anzahl_b count($banlist_content);
    $anzahl_r count($ranklist_content);

    echo 
    $anzahl_b//Test (ergibt 14)
    echo "<br>";    //Test
    echo $anzahl_r//Test (ergibt 1942)
    echo "<br>";    //Test

    for ($b 0$b $anzahl_b$b++)  //sollte 14mal durchlaufen
      
    {
       
    $array explode("|",$banlist_content[$b]);  //zeile aufsplitten
         
    for ($i 0$i $anzahl_r$i++)                //läuft 1942 mal durch
        
    {
          
    $array explode("|",$ranklist_content[$i]);  //zeile aufsplitten
         
    if ($banlist_content[$b][0] == $ranklist_content[$i][0]) //vergleichen und bei übereinstimmung...
          
    {
           echo 
    "$ranklist_content[$i][0]|$ranklist_content[$i][1]|<br>\n";  //...ergebnis anzeigen (dürften maximal 14 sein)
    }
    }

    In den Kommentaren steht meine Theorie dazu...

    Es sollten eigentlich die ID und der dazugehörige Name ausgegeben werden. Stattdessen bekomme ich nur die ID und den Namen des letzten in der Liste (der noch nicht einmal in der Banliste steht). Und das genau 1942 mal, was der Anzahl der Einträge in der ranklist entspricht.
    Zuletzt geändert von Nixblicker; 25.05.2008, 03:20.

  • #2
    Hallo Nixblicker,

    du hast einen Fehler in deinem Skript, warum es wahrscheinlich auch nicht geht:

    PHP-Code:
    $array explode("|",$ranklist_content[$i]);  //zeile aufsplitten
         
    if ($banlist_content[$b][0] == $ranklist_content[$i]>>[0]<<
    //vergleichen und bei übereinstimmung...
          
    {
           echo 
    "$ranklist_content[$i][0]|$ranklist_content[$i]>>[1]<<|<br>\n"

    Vielleicht behebt das ja dein Problem...

    Gruss

    Kommentar


    • #3
      Re: vergleichen von Dateiinhalten

      Original geschrieben von Nixblicker
      PHP-Code:
         $array explode("|",$banlist_content[$b]);  //zeile aufsplitten
           
      for ($i 0$i $anzahl_r$i++)                //läuft 1942 mal durch
          
      {
            
      $array explode("|",$ranklist_content[$i]);  //zeile aufsplitten
           
      if ($banlist_content[$b][0] == $ranklist_content[$i][0]) //vergleichen 
      1.) beim zweiten $array = explode(.. überschreibst du das erste.
      2.) für den vergleich benutzt du diese array überhaupt nicht.
      3.) warum benutzt du nicht error_reporting(E_ALL)?

      Kommentar


      • #4
        Hallo 3DMax...

        Ich fange mal von Hinten an.
        Also da das nur ein Ausschnitt aus dem Code war kannst du das ja nicht wissen, aber ganz am Anfange steht das error_reporting drin. Es zeigt aber keine Fehler mehr an, denn sonst hätte ich das auch mit geschrieben. Erleichtert es doch meistens die Fehlersuche ungemein..

        Und zu den Schleifen... ich stehe da total auf dem Schlauch, kannst du das mal anhand des Codes zeigen was du meinst?
        Ich lese ja mit "file" die Datei zeilenweise in das Array ein.
        Dann lasse ich diese Zeilen Zählen, und lasse die Schleife so oft durchlaufen wie Zeilen vorhanden sind.
        Und jedesmal wird eine Zeile der einen Datei, mit allen Zeilen der anderen Datei verglichen, wofür das
        $banlist_content[$b][0] == $ranklist_content[$i][0] zuständig ist.
        Eigentlich weis ich ja garnicht ob das Explode da überhaupt notwendig ist, spreche ich mit $banlist_content[$b][0] ja doch jedesmal direkt den ersten Datensatz des Arrays an...

        Kommentar


        • #5
          Original geschrieben von Nixblicker
          Eigentlich weis ich ja garnicht ob das Explode da überhaupt notwendig ist, spreche ich mit $banlist_content[$b][0] ja doch jedesmal direkt den ersten Datensatz des Arrays an...
          also file liefert dir ein array mit den einzelnen zeilen, da diese zeilen csv-separierte felder enthalten, musst du natürlich jede zeile auch exploden.

          ansonsten liefert dir $banlist_content[$b][0] lediglich das erste zeichen und nicht das erste csv-feld (da dachte ich, gibt es mit error_reporting eine notice, ist aber nicht so).

          gib' mal ein kurzes beispiel der beiden csvs dann kann ich dir das schnell machen, weil diese geschachtelte schleife ist nicht gerade effektiv

          Kommentar


          • #6
            Ok... also ein paar Zeilen aus der aufbereiteten Userliste:

            PHP-Code:
            ID_0:1:1234567|sdfdsfdsf|1211651454|91.39.119.237|
            ID_0:0:5842658|sdfthzjzt]|1211587124|84.53.96.37|
            ID_0:0:25485425|kljashiruea|1211036177|84.188.109.97|
            ID_0:1:524853325|ktjhkjj|1211596265|91.46.108.253

            und nun die Banliste:

            PHP-Code:
            ID_0:1:25487452|banid|0|
            ID_0:0:524854269|banid|0|
            ID_0:1:125894563|banid|0|
            ID_0:1:125684|banid|0
            Es müssen also immer nur die ersten Sätze verglichen werden, und bei einer Übereinstimmung, der komplette Datensatz aus der Userliste gespeichert werden.
            Das ganze funktioniert wie ne Art Telefonbuchliste. Ich hab ne Liste mit Telefonnummern, und eine andere mit kompletten Adressdaten, zuzüglich der Nummer. Ziel ist es, zu den gesuchten Nummern, die Adresse zu haben... Ich glaube, das ist einigermaßen verständlich erklärt

            Das Buchstabengewirre sind die Namen, und am Anfang steht immer die ID.. Ich habe auch grade noch gemerkt, das ich beim aufbereiten die Möglichkeit in Betracht ziehen muss, das einer im Namen so nen Separator (|) hat...

            Kommentar


            • #7
              Original geschrieben von Nixblicker
              Das ganze funktioniert wie ne Art Telefonbuchliste. Ich hab ne Liste mit Telefonnummern, und eine andere mit kompletten Adressdaten, zuzüglich der Nummer. Ziel ist es, zu den gesuchten Nummern, die Adresse zu haben... Ich glaube, das ist einigermaßen verständlich erklärt
              ja, das war mir schon klar
              wobei, es vielleicht empfehlenswert wäre, diese csv-dateien in einer datenbank zu verwalten.

              müsste so hinhauen (obwohl fgetscv() irgendwie buggy ist - ist mir schonmal aufgefallen)
              PHP-Code:
              // CSV-Dateien zum Auslesen
              $banlist_file 'banlist.csv';
              $ranklist_file 'ranklist.csv';


              // Liest die übergebene CSV-Datei aus und gibt ein Array
              // mit der UID (erstes CSV-Feld) als KEY und den geamten Feldern
              // als VALUE zurück
              function loadCsv($file)
              {
               
              $csv = array();

               if(!
              is_resource($fp fopen($file'r')))
               {
                die(
              "Kann CSV '{$file}' nicht öffnen");
               }

               while(
              is_array($fields fgetcsv($fp4096'|''"')))
               {
                
              $csv[$fields[0]] = $fields;
               }

               return 
              $csv;
              }

              // Alle Datzensätze aus der Rank-Liste ermitteln, die in der Ban-List enthalten sind
              $matches array_intersect_key(loadCsv($ranklist_file), loadCsv($banlist_file));

              // Zum Test mal ausgeben lassen
              echo '<pre>'.htmlentities(print_r($matchestrue)).'</pre>'
              Original geschrieben von Nixblicker
              Ich habe auch grade noch gemerkt, das ich beim aufbereiten die Möglichkeit in Betracht ziehen muss, das einer im Namen so nen Separator (|) hat...
              ja, diese felder müssten dann mit " eingeschlossen werden und ", falls die auch vorkommen dürfen, im feld wiederum escaped werden.
              dafür hat php allerdings keine funktion

              Kommentar


              • #8
                Tut mir leid das ich mich so lange nicht gemeldet habe. Ich bin aber nicht so unhöflich , mich nicht für die Hilfe zu bedanken...
                Ich hatte nur im RL ne menge zu tun...

                Deine Lösung funktioniert super, und ich habs jetzt auch geschafft, das Problem mit den "|" im Namen zu umgehen. Ich wandle diese Zeichen (wenn sie vorkommen) beim konvertieren der Files um, und beim Anzeigen der Liste wieder zurück.
                Der Rest ist jetzt nur noch Fleißarbeit...

                Also nochmal vielen Dank für deine sehr sehr große Hilfe
                Zuletzt geändert von Nixblicker; 02.06.2008, 22:27.

                Kommentar

                Lädt...
                X