Ankündigung

Einklappen
Keine Ankündigung bisher.

Vergleiche von *.txt

Einklappen

Neue Werbung 2019

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

  • Vergleiche von *.txt

    Hallo zusammen!
    Ich bräuchte mal einen Tipp von euch.
    Ich hab zwei Textdateien.txt, diese beiden möchte ich miteinander Vergleichen.
    Also nciht Zeile für Zeile. Ich würde gerne die Daten ausgegeben haben, die sich in der thisMonth.txt befinden, aber nicht in der send.txt.
    Jedoch sind die Inhalte der beiden Dateien nciht so ident, das ich array_diff verwenden könnte.
    In send.txt steht in etwa:
    08.09.2014 - 16:06:10 || AbsenderName: *** --> AbsenderMail: ***@** --> Empfaenger Mail: ***@**

    in der thisMonth.txt steht allerdings:
    [receiver] => ***
    [receivermail] => ***@**
    [mailer] => ***@**

    Mein erster gedanke ist es, eine if schleife einzubauen die Prüft ob [receivermail] == der Mail von Empfaenger Mail ist und gleichzeitig ob [mailer] == AbsenderMail ist. ich weis nur nciht ganz wo ich das einbauen kann. Bis jetzt hab ich folgendes:
    PHP-Code:
    $rows1 file("../thisMonth.txt");
        
    $rows2 file("../send.txt");
        
        
    $diffRows array_diff($rows1$rows2); (Das geht nicht so?)
        
    $ausgabe "ausstehend.txt";
        
        if (
    $diffRows >= '1')
        {
            
    $fp fopen($ausgabe"a+");
            foreach(
    $diffRows as $row)
            {
              
    fputs($fp$row);
            }
        }
           else
           {
            echo 
    "Es ers gibt keine Unterschiede!";
           }
        
    fclose($fp); 


  • #2
    Also nciht Zeile für Zeile. Ich würde gerne die Daten ausgegeben haben, die sich in der thisMonth.txt befinden, aber nicht in der send.txt.
    Spezifiziere das genauer, du meinst 1:1 die Zeilen, oder nur Teile von einer Zeile, du sprachst von

    eine if schleife einzubauen die Prüft ob [receivermail] == der Mail von Empfaenger Mail ist und gleichzeitig ob [mailer] == AbsenderMail ist.
    If() ist übrigens keine Schleife, sondern eine Kontrollstruktur.

    Wie oft sollte das passieren? Wenn es "ab und zu mal" sein soll würde ich mein Glück mal mit zB WinMerge versuchen, oder Tools dieser Art, wenn es um Unterschiedliche Zeilen geht.

    Wenn es dir jedoch "nur" darum geht ob zB eine E-Mail-Adresse darin schonmal vorgekommen ist, schauts wieder anders aus. Welche Infos brauchst du dann zB, nur das die schon vorhanden ist, ist der ursprüngliche Zeitpunkt wichitg, oder nicht etc.. etc.. Das sind alles nicht unrelevatnte Details die du uns vorher verraten solltest.

    LG
    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      Danke für deine Antwort.
      Ich würde dafür ungern ein Tool verwenden. Möchte es selber schreiben.
      Mit Ab und zu meine ich das dieses Skript täglich ausgeführt werden soll.
      Ich möchte Prüfen, ob die Emailadresse und genau dieser Name schon in der anderen Datei drinnensteht, allerdings zusammenhängend und nicht wahrlos irgendwo gefunden wird.
      Ich hab also diese Datei(thisMonth.txt):
      PHP-Code:
      [receiver1] => ***
      [
      receivermail1] => ***@**
      [
      mailer1] => ***@**
      ...
      [
      receiver2] => ***
      [
      receivermail2] => ***@**
      [
      mailer2] => ***@* 
      und die hier(send.txt):
      PHP-Code:
      08.09.2014 16:06:10 || AbsenderName1: *** --> AbsenderMail1: ***@** --> Empfaenger Mail1: ***@**
      ...
      08.09.2014 16:10:10 || AbsenderName2: *** --> AbsenderMail2: ***@** --> Empfaenger Mail2: ***@** 
      So nun möchte ich das geprüft wird, ob ob alle die in thisMonth.txt sind, auch in send.txt stehen. Die die nicht drinnen sind, sollen in einer extra **.txt ausgegeben werden.
      Der ZEitpunkt ist unwichtig. Ich möchte damit überprüfen ob die von mir ausgewählten Personen das Formular an die richtige Person geschickt habe. Also muss mein "Person1 schickt an die Person2 ein Formular, mit dem übereinstimmen was die Personen wirklich tun.

      Kommentar


      • #4
        Da Du ja Blocks hast in der thisMonth.txt, kannst Du je Block ( file und array_chunk hilft beim aufteilen ) schauen,
        ob Du über RegularExpressions ( hier am besten file und preg_grep ) einen Zeile in der send.txt findest, die Namen und Email desselben Blocks enthält.

        ABER: Das ist nur Gefummel!
        Sinnvoller wäre, die Quelldaten sauberer zur Verfügung zu stellen.
        Competence-Center -> Enjoy the Informatrix
        PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

        Kommentar


        • #5
          Ja, ich hab mir auch schon gedacht, das ganze wäre einfacher, wenn die send.txt in der gleichen Struktur wäre wie die thisMonth.txt.
          Das gestaltet sich aber als schwierig.
          Danke erstmal, werde mir die Tips mal genauer anschaun.

          edit:

          das preg_grep wäre an sich eine gute Idee, wenn ich wüsste wonach ich suche. Aber das weis ich im normalfall ja nicht.
          Das hab ich bis jetzt, aber ich wüsste nicht nach welchem Muster ich suchen soll.
          PHP-Code:
          $rows1 file("../Ergebnis/thisMonth.txt");
              
          $rows2 file("../Ergebnis/gesendete_Feedbacks.txt");
              
              
          $result print_r(array_chunk($rows1'4'));
              
          $result .= print_r(array_chunk($rows2'12'));

              
          $similar preg_grep(, $result); 
          Ich will ja was in der Art
          PHP-Code:
          $infos "Ergebnis: $similar \n";
          $ausgabe "ausstehendeFB.txt";

          $fp fopen($ausgabe"a");
              
                  if([
          'fbrm'] != $fbr && ['fbum'] != $fbum)
                  {
                  
          fwrite ($fp,print_r($infos). "\n"); 

          Kommentar


          • #6
            das preg_grep wäre an sich eine gute Idee, wenn ich wüsste wonach ich suche. Aber das weis ich im normalfall ja nicht.
            Einen passenden regulären Ausdruck kannst du dir auf Basis der Daten aus der einen Datei zusammenbauen.

            if(['fbrm'] != $fbr && ['fbum'] != $fbum)
            Das ist <strike>kein gültiger</strike> wahrscheinlich an der Stelle kein sinnvoller PHP-Code und unter den Bezeichnungen kann sich kein Mensch was vorstellen, der nicht weiß, was die bedeuten sollen. Ich sage es nur.

            Ich lasse ansonsten das mal hier:

            PHP-Code:
            <?php

            $file1 
            = <<<EOT
            [receiver1] => Klaus
            [receivermail1] => klaus@example.org
            [mailer1] => uschi@example.org
            [receiver2] => Pete
            [receivermail2] => pete@example.org
            [mailer2] => esteban@example.org
            EOT;

            $file2 = <<<EOT
            08.09.2014 - 16:06:10 || AbsenderName1: Peter --> AbsenderMail1: peter@example.org --> Empfaenger Mail1: steffi@example.org
            08.09.2014 - 16:10:10 || AbsenderName2: Susi --> AbsenderMail2: susi@example.org --> Empfaenger Mail2: daniel@example.org
            EOT;

            /**
             *
             * @param resource $handle
             * @return array
             * @throws Exception
             */
            function parseFile1($handle)
            {
                
            $entries = array();

                
            $lastIndex   null;
                
            $entryBuffer = array();

                
            $buffer fgets($handle);

                while (
            false !== $buffer) {
                    
            $line trim($buffer);

                    
            // Ignore empty lines
                    
            if ('' === $line) {
                        goto 
            next;
                    }

                    
            $tmp     = array();
                    
            $matched preg_match('/^\[(.+?)\] => (.*)$/'$line$tmp);

                    if (
            === $matched) {
                        throw new 
            Exception();
                    }

                    
            $tmp2 = array();
                    
            $matched2 preg_match('/^(.*?)([0-9]+)$/'$tmp[1], $tmp2);

                    if (
            === $matched2) {
                        throw new 
            Exception();
                    }

                    
            $newIndex $tmp2[2];

                    if (
            $newIndex !== $lastIndex && !== count($entryBuffer)) {
                        
            $entries[$lastIndex] = $entryBuffer;
                        
            $entryBuffer = array();
                    }

                    
            $entryBuffer[$tmp2[1]] = trim($tmp[2]);

                    
            $lastIndex $newIndex;

                    
            next:
                        
            $buffer fgets($handle);
                }

                if (
            !== count($entryBuffer)) {
                    
            $entries[$lastIndex] = $entryBuffer;
                }

                return 
            $entries;
            }

            /**
             *
             * @param resource $handle
             * @return array
             * @throws Exception
             */
            function parseFile2($handle)
            {
                
            $entries = array();

                
            $buffer fgets($handle);

                while (
            false !== $buffer) {
                    
            $line trim($buffer);

                    
            // Ignore empty lines
                    
            if ('' === $line) {
                        goto 
            next;
                    }

                    
            $tmp     = array();
                    
            $matched preg_match(
                        
            '/^[0-9]{2}\.[0-9]{2}\.[0-9]{4} - [0-9]{2}:[0-9]{2}:[0-9]{2} \|\| '
                            
            'AbsenderName([0-9]+): (.*?)'
                            
            ' --> AbsenderMail(?:[0-9]+): (.*?)'
                            
            ' --> Empfaenger Mail(?:[0-9]+): (.*?)'
                            
            '$/',
                        
            $line,
                        
            $tmp
                    
            );

                    if (
            === $matched) {
                        throw new 
            Exception();
                    }

                    
            $entries[$tmp[1]] = array(
                        
            'AbsenderName' => trim($tmp[2]),
                        
            'AbsenderMail' => trim($tmp[3]),
                        
            'Empfanger Mail' => trim($tmp[4])
                    );

                    
            next:
                        
            $buffer fgets($handle);
                }

                return 
            $entries;
            }

                              
            // Funktioniert auch mit Dateien, data:// nutze ich, um alles
                              // für das Beispiel in eine Datei schreiben zu können
            $handle1 fopen('data://text/plain;base64,' base64_encode($file1), 'rb');
            $handle2 fopen('data://text/plain;base64,' base64_encode($file2), 'rb');

            var_dump(
                
            parseFile1($handle1),
                
            parseFile2($handle2)
            );

            /*
            array(2) {
              [1]=>
              array(3) {
                ["receiver"]=>
                string(5) "Klaus"
                ["receivermail"]=>
                string(17) "klaus@example.org"
                ["mailer"]=>
                string(17) "uschi@example.org"
              }
              [2]=>
              array(3) {
                ["receiver"]=>
                string(4) "Pete"
                ["receivermail"]=>
                string(16) "pete@example.org"
                ["mailer"]=>
                string(19) "esteban@example.org"
              }
            }
            array(2) {
              [1]=>
              array(3) {
                ["AbsenderName"]=>
                string(5) "Peter"
                ["AbsenderMail"]=>
                string(17) "peter@example.org"
                ["Empfanger Mail"]=>
                string(18) "steffi@example.org"
              }
              [2]=>
              array(3) {
                ["AbsenderName"]=>
                string(4) "Susi"
                ["AbsenderMail"]=>
                string(16) "susi@example.org"
                ["Empfanger Mail"]=>
                string(18) "daniel@example.org"
              }
            }
            */

            Kommentar


            • #7
              Oh wow super. Danke ich werde mich gleich mal durchwühlen. ^^ Damit hatte ich nicht gerechnet!

              Gleich mal ne Frage: Kann ich gleich zu Beginn bei $file1 auch gleich auf die txt Datei zugreifen, in der die Ergebnisse stehen? Also mit
              PHP-Code:
              $file1file("../Ergebnis/thisMonth.txt");? 
              Und noch ne Frage, was bedeutet das 'rb' bei fopen? --> hat sich schon erledigt, habs herausgefunden.

              Du hast geschrieben fopen .. funktioniert auch mit Dateien.
              Kann ich da den relativen Pfad angeben?

              Kommentar


              • #8
                Wie du den Pfad angibst, bleibt dir überlassen. Theoretisch kannst du den aber relativ angeben.

                Im Zweifel immer in der Doku gucken, ausprobieren, gegebenenfalls debuggen…

                Kommentar


                • #9
                  Ich hab es versucht in dem ich zu Beginn, anstatt des Striings die Dateien einlese.
                  PHP-Code:
                  $file1 file('../Ergebnis/thisMonth.txt');
                      
                  $file2 file('../Ergebnis/gesendete_Feedbacks.txt'); 
                  Ich bekomm eine Fehlermeldung á la "Warning: base64_encode() expects parameter 1 to be string, array given in.."
                  Ich hab also einen Fehler beim Aufrufen, aber das funktioniert doch so, oder nciht.

                  Kommentar


                  • #10
                    "Warning: base64_encode() expects parameter 1 to be string, array given in.
                    Und was ist daran unverständlich? Du übergibst an base64_encode() ein Array, es muss aber ein String sein. file() zB gibt ein Array zurück.
                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar


                    • #11
                      Wobei das Base64-Zeugs sowieso raus kann, wenn per fopen eine physisch existierende Datei geöffnet wird statt eines data-URI-Streams.

                      Das wäre dann eben einfach (hier mit relativen Pfaden):

                      PHP-Code:
                      $handle1 fopen('../file1.txt''rb');
                      $handle2 fopen('../file2.txt''rb');

                      var_dump(
                          
                      parseFile1($handle1),
                          
                      parseFile2($handle2)
                      ); 

                      Kommentar


                      • #12
                        Danke eure Beiträge haben mir bis jetzt gut geholfen.

                        Kommentar


                        • #13
                          Danke eure Beiträge haben mir bis jetzt gut geholfen.
                          Nachdem ich jetzt den gleichen Grundstein habe kann ich anfangen mit dem Vergleichen.
                          Aber hab da noch eine Frage zu deinem Code.
                          Ich hab als BSP folgendes geschrieben gehabt
                          PHP-Code:
                          [receiver1] => ***
                          [
                          receivermail1] => ***@**
                          [
                          mailer1] => ***@**
                          ...
                          [
                          receiver2] => ***
                          [
                          receivermail2] => ***@**
                          [
                          mailer2] => ***@* 
                          allerdings sollte das nur verdeutlichen, dass es sich um mehrere handelt. Die Zahlen stehen also in wirklichkeit gar nicht bei den Ausdrücken. Wo stheth das in deinem Code, damit ich es ändern kann. Die Schreibweise ist mir leider noch etwas zu hoch. Ich bin in dem Bereich noch nicht so gut, muss mir das erst alles umschreiben.

                          Kommentar


                          • #14
                            Das macht den Code einfacher, weil diese numerischen „IDs“ nicht mehr rausgefischt werden müssen.

                            PHP-Code:
                            <?php

                            $file1 
                            = <<<EOT
                            [receiver] => Klaus
                            [receivermail] => klaus@example.org
                            [mailer] => uschi@example.org
                            [receiver] => Pete
                            [receivermail] => pete@example.org
                            [mailer] => esteban@example.org
                            EOT;

                            $file2 = <<<EOT
                            08.09.2014 - 16:06:10 || AbsenderName: Peter --> AbsenderMail: peter@example.org --> Empfaenger Mail: steffi@example.org
                            08.09.2014 - 16:10:10 || AbsenderName: Susi --> AbsenderMail: susi@example.org --> Empfaenger Mail: daniel@example.org
                            EOT;

                            /**
                             *
                             * @param resource $handle
                             * @return array
                             * @throws Exception
                             */
                            function parseFile1($handle)
                            {
                                
                            $entries = array();

                                
                            $entryBuffer = array();

                                
                            $buffer fgets($handle);

                                while (
                            false !== $buffer) {
                                    
                            $line trim($buffer);

                                    
                            // Ignore empty lines
                                    
                            if ('' === $line) {
                                        goto 
                            next;
                                    }

                                    
                            $tmp     = array();
                                    
                            $matched preg_match('/^\[(.+?)\] => (.*)$/'$line$tmp);

                                    if (
                            === $matched) {
                                        throw new 
                            Exception('Found line with invalid format');
                                    }

                                    
                            $entryBuffer[$tmp[1]] = trim($tmp[2]);

                                    if (
                            === count($entryBuffer)) {
                                        
                            $entries[] = $entryBuffer;
                                        
                            $entryBuffer = array();
                                    }

                                    
                            next:
                                        
                            $buffer fgets($handle);
                                }

                                if (
                            !== count($entryBuffer)) {
                                    throw new 
                            Exception('Last entry in file is incomplete');
                                }

                                return 
                            $entries;
                            }

                            /**
                             *
                             * @param resource $handle
                             * @return array
                             * @throws Exception
                             */
                            function parseFile2($handle)
                            {
                                
                            $entries = array();

                                
                            $buffer fgets($handle);

                                while (
                            false !== $buffer) {
                                    
                            $line trim($buffer);

                                    
                            // Ignore empty lines
                                    
                            if ('' === $line) {
                                        goto 
                            next;
                                    }

                                    
                            $tmp     = array();
                                    
                            $matched preg_match(
                                        
                            '/^[0-9]{2}\.[0-9]{2}\.[0-9]{4} - [0-9]{2}:[0-9]{2}:[0-9]{2} \|\| '
                                            
                            'AbsenderName: (.*?)'
                                            
                            ' --> AbsenderMail: (.*?)'
                                            
                            ' --> Empfaenger Mail: (.*)'
                                            
                            '$/',
                                        
                            $line,
                                        
                            $tmp
                                    
                            );

                                    if (
                            === $matched) {
                                        throw new 
                            Exception('Found line with invalid format');
                                    }

                                    
                            $entries[] = array(
                                        
                            'AbsenderName'   => trim($tmp[1]),
                                        
                            'AbsenderMail'   => trim($tmp[2]),
                                        
                            'Empfanger Mail' => trim($tmp[3])
                                    );

                                    
                            next:
                                        
                            $buffer fgets($handle);
                                }

                                return 
                            $entries;
                            }

                                              
                            // Funktioniert auch mit Dateien, data:// nutze ich, um alles
                                              // für das Beispiel in eine Datei schreiben zu können
                            $handle1 fopen('data://text/plain;base64,' base64_encode($file1), 'rb');
                            $handle2 fopen('data://text/plain;base64,' base64_encode($file2), 'rb');

                            var_dump(
                                
                            parseFile1($handle1),
                                
                            parseFile2($handle2)
                            );

                            Kommentar


                            • #15
                              Danke du bist super!

                              Ich hab das Gefühl meine Fragen nehmen kein Ende.
                              ich hab ein Array mittels fwrite in eine txt Datei geschrieben.
                              PHP-Code:
                              $fp fopen("thisMonth.txt""a");
                              foreach(
                              $meinArrayNow as $key)
                              {
                              fwrite($fpprint_r($keyTRUE) . "\n");
                              }    
                              fclose($fp);
                              $fp fopen("send.txt""a");
                              fwrite($fpprint_r($infosTRUE). "\n");
                               
                              fclose($fp); 
                              Wenn ich jetzt die Datei aber, mit dem Code, den du gepostet hast öffnen will dann geht es nicht. Ein Blick hinter die Kulissen hat mir verraten, das $file1 boolean ist und nicht string. Wie geht das? $file2 wird normal als string erkannt.
                              PHP-Code:
                              $file1 file_get_contents('thisMonth.txt');
                              $file2 file_get_contents('send.txt'); 
                              Als Fehlermeldung bekomme ich "Warning: fgets() expects parameter 1 to be resource, boolean given in '$buffer = fgets($handle);' "
                              Und noch eine Frage
                              PHP-Code:
                              $file1 = <<<EOT
                              [receiver] => Klaus
                              [receivermail] => klaus@example.org
                              [mailer] => uschi@example.org
                              [receiver] => Pete
                              [receivermail] => pete@example.org
                              [mailer] => esteban@example.org
                              EOT; 
                              Das ist doch ein string, oder? Warum bekomm ich dann eine Fehlermeldung wenn ich $file2 einlese. Wenn ich mit gettype überprüfe, dann ist das ebenfalls ein String, aber da bekomm ich folgende Meldung "Warning: fgets() expects parameter 1 to be resource, string given in '$buffer = fgets($handle);' "

                              Kommentar

                              Lädt...
                              X