PHP Anfänger: Daten einlesen, vergleichen, Ergebnis speichern.

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

  • PHP Anfänger: Daten einlesen, vergleichen, Ergebnis speichern.

    Hallo.

    In diesem Beitrag habe ich folgende Aufgabenstellung zu lösen.
    In einer Datei stehen zeilenweise Verben.
    Diese Verben (Suchnamen) sollen in Dateien eines Ordners gesucht werden.
    Wenn fündig geworden, in neue Datei nach folgendem Schema schreiben:
    Dateiname der Datei, die Suchname enthält#Suchname1, Suchmame2, Suchname3 usw.
    Beispiel: gehen#geht,gehen,ging
    Wenn nicht fündig geworden, Suchnamen in andere Datei schreiben.

    Hintergrund:
    Ich möchte die Verben portugiesischer Texte mit den entsprechenden Übersetzungstabellen verlinken. Diese stehen in einem eigenen Ordner als eigenständige Datei und sollen später per include eingebunden werden.
    Jetzt möchte ich erst einmal festhalten, welche Verben zu welchen Tabellen gehören und dieses zur weiteren Verarbeitung abspeichern.

    Ablaufplan:
    Zeilenweises Einlesen der Datei Suchnamen.txt mit file
    Festlegen des TabellenOrdners
    Handler erstellen mit opendir
    Mit while und readdir die Dateien der Reihe nach durcharbeiten.
    Feststellen, ob Suchname in der Datei vorhanden ist.
    Dateinamen der Datei, die den Suchnamen enthält mit dem Suchnamen in neue Datei nach obrigem Schema schreiben.
    Wenn nicht gefunden, in andere Datei Suchnamen schreiben.

    Lösungsversuch:

    PHP-Code:
    <?php
    $SuchNam 
    'Suchnamen.txt';
    $TzO 'TabzuOrdnung.txt'
    $KTzO 'KeineTabzuOrdnung.txt';
    $SN file ($SuchNam);
    $dir 'tabs/';
    $dh opendir($dir);

    foreach (
    $SN as $nr => $zeile) { //echo ($SN).($nr).($zeile).'<br>';
                                    
    while ($file readdir ($dh)){
                                    
    //print_r($file);
                                        
    if (is_file($file)){
                                        
    //Anweisungen
                                        
    $lines file ($file);
                                            foreach (
    $lines as $value => $Lzeile) {
                                            echo (
    "$Lzeile");
                                        
                                          }
                                        }
                                         }
                                    }
    closedir($dh);
    ?>
    Zu dem hier erstellten Code habe ich verschiedene Fragen.
    1. Wieso bekomme ich mit dem letzten echo nicht die erste Zeile der ersten Datei im Tabellenordner angezeigt, wie ich es erwartet hatte, sondern gar nichts?
    Danach wollte ich nähmlich die Zeile auf Suchnamen prüfen, was mich zur zweiten Frage führt.
    2. Wie prüfe ich in PHP, ob in einem Array ein Begriff vorhanden ist? Oder grundsätzlicher, wie überprüfe ich, ob in einer Datei ein Begriff vorhanden ist?

    Wenn es günstigere Lösungsansätze gibt, bin ich für Hinweise dankbar.

    Gruß
    Estrela
    Denk positiv.

  • #2
    Hallo zusammen.

    Ich habe jetzt mal einen anderen Ansatz gewählt, indem ich zuerst die Tabellen versuche einzulesen:
    PHP-Code:
    <?php
    $SuchNam 
    'Suchnamen.txt';
    $TzO 'TabzuOrdnung.txt'
    $KTzO 'KeineTabzuOrdnung.txt';
    $SN file ($SuchNam);
    $dir 'tabs/';

    if (
    $handle opendir($dir)) {
        while (
    false !== ($file readdir($handle))) {
            if (
    $file != "." && $file != "..") {
                echo 
    "$file\n".'<br>';
                
    $Text file_get_contents ($file); // Line 21
                //echo ($Text);
            
    }
        }
        
    closedir($handle);
    }
    ?>
    Leider bekomme ich jetzt folgende Fehlermeldungen pro Datei:
    purificar.php

    Warning: file_get_contents(purificar.php) [function.file-get-contents]: failed to open stream: No such file or directory in /home/public_html/test2/test2.php on line 21

    Das vorlaufende echo liefert aber genau diese Dateien, die mit file_get_contens als nicht vorhanden angemahnt werden.
    Ich habe die Dateiattribute probehalber auf 777 gesetzt, aber ohne Wirkung.

    Wo ist der Fehler?
    Währe hilfreich, wenn mir jemand auf die Sprünge helfen könnte.

    Gruß
    Estrela
    Denk positiv.

    Kommentar


    • #3
      No such file or directory in /home/public_html/test2/test2.php on line 21
      Sagt doch schon alles. Du solltest dir noch einmal ansehen, was readdir genau macht
      Gibt den Dateinamen des nächsten Files des Verzeichnisses zurück.
      Entscheidend ist der Unterschied zwischen Dateiname und Dateipfad. Jetzt solltest du drauf kommen können

      Kommentar


      • #4
        Hallo PHP-Desaster.

        Deine Antworten sind besser, als Dein Name vermuten läßt. Du hast nähmlich genau mein Mißverständnis erkannt.
        Ich ging nähmlich implizit davon aus, das sich das Script, und damit auch der Befehl file_get_contens schon im Ordner tabs befindet, weil ich ja diesen Weg schon hatte beschreiten lassen, um die Dateinamen herrauszufinden.
        Aber auch nur genau diese befinden sich ja jetzt in der Variablen, so das der nächste Befehl nach den Dateinamen im Ordner der ausführenden Datei sucht. Ist ja auch logisch.
        Danke für Deine Aufklärung.
        Dann schreibe ich file_get_contents ("$dir".$file); und es funktioniert.
        Das nachfolgende echo zeigt den Inhalt aller Dateien.
        Ich habe jetzt mal versucht, die Prüfung auf folgende Weise zu realisieren:
        PHP-Code:
        <?php
        $SuchNam 
        'Suchnamen.txt';
        $TzO 'TabzuOrdnung.txt'
        $KTzO 'KeineTabzuOrdnung.txt';
        $SN file ($SuchNam);
        $dir 'tabs/';

        if (
        $handle opendir($dir)) {
            while (
        false !== ($file readdir($handle))) {
                if (
        $file != "." && $file != "..") {
                    echo 
        "$file\n".'<br>';
                    
        $Text file_get_contents ("$dir".$file);
                    
        $Prüf stripos($Text$SN);
                    echo (
        $SN);
                        if (
        $Prüf === false) {
                        
        // Anweisungen für nicht vorhanden
                        
        }
                        if (
        $Prüf !== false) {
                        
        // Anweisungen für vorhanden            
                        
        }
                }
            }
            
        closedir($handle);
        }
        ?>
        Da bekomme ich diese Meldung: Warning: stripos() [function.stripos]: needle is not a string or an integer.
        Er ist also mit $SN nicht einverstanden, das ja durch file ein Array ist.
        Wie formuliere ich in PHP, das jede Datei auf vorhandensein aller Suchnamen in der Datei Suchnamen.txt geprüft wird?

        Dank und Gruß
        Estrela
        Denk positiv.

        Kommentar


        • #5
          Original geschrieben von Estrela
          Da bekomme ich diese Meldung: Warning: stripos() [function.stripos]: needle is not a string or an integer.
          Er ist also mit $SN nicht einverstanden, das ja durch file ein Array ist.
          Wie formuliere ich in PHP, das jede Datei auf vorhandensein aller Suchnamen in der Datei Suchnamen.txt geprüft wird?
          dass array kannst du mit einer schleife durchlaufen: foreach

          um gleich dem nächsten problem vorzubeugen, file liest die zeilen inkl. zeilenumbruch ein, den musst du eventuell noch entfernen rtrim() (je nachdem, wie deine einzulesenden dateien aufgebaut sind)

          Kommentar


          • #6
            Hallo zusammen.

            Also die Abfragen scheinen mir "suboptimal" zu sein.
            PHP-Code:
            if ($handle opendir($dir)) {
                while (
            false !== ($file readdir($handle))) {
                    if (
            $file != "." && $file != "..") {
                        
            //echo "$file\n".'<br>';
                        
            $Text file_get_contents ("$dir".$file);
                        
            //echo ($Text);
                        
            foreach ($SN as $nr => $zeile) {
                            
            $Prüf stripos($Text$zeile);
                            
            //echo ($zeile);
                                
            if ($Prüf === false) {
                                
            // Anweisungen für nicht vorhanden
                                
            $Schreib file_put_contents ($KTzO$zeile,FILE_APPEND);
                                }
                                if (
            $Prüf !== false) {
                                
            // Anweisungen für vorhanden
                                
            $Schreib file_put_contents ($TzO$zeile,FILE_APPEND);            
                                }
                            }
                    }
                }
                
            closedir($handle);

            Ein paar Zahlen zum Hintergrund.
            In jeder Tabelle sind ca 400 Zeilen vorhanden und sehen an den entscheidenen Stellen so aus:
            <td align="center">abençoa</td>
            <td align="center">não abençoes</td>
            </tr>
            <tr>
            <td align="center">abençoe</td>
            <td align="center">não abençoe</td>
            </tr>
            <tr>
            <td align="center">abençoemos</td>
            <td align="center">não abençoemos</td>
            </tr>
            <tr>
            <td align="center">abençoai</td>
            <td align="center">não abençoeis</td>

            Ich sage das, weil ich keine einzige Übereinstimmung angezeigt bekomme. Dafür aber 499 doppelte Einträge in $KTzO, weil ja für jede Datei überprüft wird.
            Wie frage ich die Anwesenheit des Verbes in der Tabelle richtig ab und wie schreibe ich dieses Verb bei Nichtübereinstimmung mit keiner Tabelle in $KTzO derartig, das es dann auch nur einmal aufgeführt wird und nicht wie jetzt pro Tabelle einmal?

            Von diesen Tabellen sind ca 500 vorhanden und in Suchnamen.txt stehen etwa 3000 Wörter, was ich deshalb erwähne, weil ein timeout angezeigt wurde.

            Währe freundlich, wenn mir jemand in dieser verschachtelten Situation weiterhilft.

            Estrela
            Denk positiv.

            Kommentar


            • #7
              warum stellst du neue fragen, wenn du meine antwort aus deiner vorangegangenen frage ignorierst?

              ich hatte dich auf ein problem aufmerksam gemacht, welches du jetzt anscheinend hast.

              insofern verkneife ich mir antworten auf deine neuen fragen.

              Kommentar


              • #8
                Hallo 3DMax.

                Deinem Hinweis auf foreach bin ich doch nachgegangen.
                Hätte nicht gedacht, das der Zeilenumbruch Auswirkungen auf den Vergleich hat, obwohl Du ja auf ein nächstes Problem verwiesen hast.
                Habe also die Zeilen wie folgt modifiziert:
                PHP-Code:
                            foreach ($SN as $nr => $zeile) {
                                
                $zeile rtrim ($zeile);
                                
                $Prüf stripos($Text$zeile); 
                Das grundlegende Problem der Gestaltung der Abfragen bleibt jedoch bestehen, wie ein erneutes: "Fatal error: Maximum execution time of 60 seconds exceeded in " wieder gezeigt hat.
                Insofern möchte ich Dich einladen, Deine Antworten auf die neuen Fragen einfach fließen zu lassen.

                Gruß
                Estrela
                Denk positiv.

                Kommentar


                • #9
                  Original geschrieben von Estrela
                  Das grundlegende Problem der Gestaltung der Abfragen bleibt jedoch bestehen, wie ein erneutes: "Fatal error: Maximum execution time of 60 seconds exceeded in " wieder gezeigt hat.
                  zu optimieren gibt es natürlich jede menge, aber es ist ja eine einmalige aktion. von daher einfach mal das zeitlimit auf anschlag setzen.
                  PHP-Code:
                  ini_set('max_execution_time', -1); 
                  ein strip_tags() auf den inhalt der tabellen-dateien ist in diesem zusammenhang auch ratsam, aber hauptsächlich um fehler zu vermeiden (html-tags, die u.u. den suchbegriff enthalten)

                  so, das script sollte dann erstmal durchlaufen.
                  du müsstest dann nochmal erklären, was du genau speichern möchtest.

                  Kommentar


                  • #10
                    Hallo 3DMax.

                    Jetzt trudeln auf jeden Fall schon mal mehr gefundene Übereinstimmungen in der Datei $TzO ein. Super.

                    Was auf jeden Fall falsch an dieser Stelle ist, ist die Abfrage auf nicht Übereinstimmung und die anschließende Behandlung.
                    Der richtige Ablauf währe folgendermaßen:
                    Zuerst stehen alle zu überprüfenden Begriffe in der Datei Suchnamen.txt.
                    Dann werden diese Suchnamen mit der ersten Tabelle verglichen.
                    Die gefundenen Übereinstimmungen sollen mit dem Namen der Datei der Tabelle zeilenweise in $TzO gespeichert werden. Beispiel:
                    laufen.php# gelaufen,lief,laufen
                    gehen.php#ging, gehen, gegangen usw.
                    Das bedeutet, wenn das Suchwort gelaufen in der Tabelle laufen.php gefunden wird, soll das script in der Datei $TzO überprüfen, ob schon eine Zeile existiert, die mit laufen.php beginnt.
                    Wenn nein, in neue Zeile laufen.php schreiben mit anschließendem Trennzeichen # und dem Suchwort gelaufen.
                    Wenn ja, in dieser gefundenen Zeile ans Ende springen, ein Komma einfügen und das aktuelle Suchwort anfügen.
                    Dadurch wird dann ersichtlich, welche Tabelle für welche Suchnamen(Verben) zuständig ist.
                    Die gefundenen Übereinstimmungen sollen aber auch aus der Datei Suchnamen.txt entfernt werden, damit sie bei der nächsten Tabelle nicht wieder mit überprüft werden müssen. Somit werden nach und nach die Übereinstimmungen aus der Datei Suchnamen entfernt, so das danach nur noch die nicht übereinstimmenden Namen in der Datei Suchnamen vorhanden sind, womit sich dann auch obrige falsche Abfrage auf Nichtübereinstimmung erübrigt.

                    Wenn Du mir da bei der Übersetzung in PHP behilflich sein könntest, währe ich Dir echt dankbar.

                    Der aktuelle Stand:
                    PHP-Code:
                    <?php
                    $SuchNam 
                    'Suchnamen.txt';
                    $TzO 'TabzuOrdnung.txt'
                    $KTzO 'KeineTabzuOrdnung.txt';
                    $SN file ($SuchNam);
                    $dir 'tabs/';
                    ini_set('max_execution_time', -1);

                    if (
                    $handle opendir($dir)) {
                        while (
                    false !== ($file readdir($handle))) {
                            if (
                    $file != "." && $file != "..") {
                                
                    //echo "$file\n".'<br>';
                                
                    $Text file_get_contents ("$dir".$file);
                                             
                    $Text strip_tags($Text);
                                
                    //echo ($Text);
                                
                    foreach ($SN as $nr => $zeile) {
                                    
                    $zeile rtrim ($zeile);
                                    
                    $Prüf stripos($Text$zeile);
                                    
                    //echo ($zeile);
                                        
                    if ($Prüf === false) {
                                        
                    // Anweisungen für nicht vorhanden
                                        //$Schreib = file_put_contents ($KTzO, $zeile,FILE_APPEND);
                                        
                    }
                                        if (
                    $Prüf !== false) {
                                        
                    // Anweisungen für vorhanden
                                        
                    $Schreib file_put_contents ($TzO$zeile,FILE_APPEND);            
                                        }
                                    }
                            }
                        }
                        
                    closedir($handle);
                    }
                    ?>
                    Gruß
                    Estrela
                    Zuletzt geändert von Estrela; 21.08.2008, 14:48.
                    Denk positiv.

                    Kommentar


                    • #11
                      Original geschrieben von Estrela
                      Tabelle zeilenweise in $TzO gespeichert werden. Beispiel:
                      laufen.php# gelaufen,lief,laufen
                      gehen.php#ging, gehen, gegangen usw.
                      Das bedeutet, wenn das Suchwort gelaufen in der Tabelle laufen.php gefunden wird, soll das script in der Datei $TzO überprüfen, ob schon eine Zeile existiert, die mit laufen.php beginnt.
                      Wenn nein, in neue Zeile laufen.php schreiben mit anschließendem Trennzeichen # und dem Suchwort gelaufen.
                      Wenn ja, in dieser gefundenen Zeile ans Ende springen, ein Komma einfügen und das aktuelle Suchwort anfügen.
                      ich würd's nicht direkt in die datei schreiben, sondern erstmal in ein mehrdimensionales array (key ist der dateiname, value ist ein array der suchwörter dazu) und das dann ganz am ende wegschreiben.
                      PHP-Code:
                      // Leeres Trefferarray
                      $treffer = array();

                      // Einfügen von Datei und Suchwort (innerhalb der Schleife)
                      if(!isset($treffer[$datei]))
                      {
                          
                      $treffer[$datei] = array();
                      }

                      $treffer[$datei][] = $suchwort;


                      // Ganz am Ende, das Array zeilenweise in dein geünschtes Format konvertieren
                      foreach($treffer as $datei => $suchwoerter)
                      {
                          
                      $zeile $datei.'#'.implode(','$suchwoerter)."\n";



                      Original geschrieben von Estrela
                      Die gefundenen Übereinstimmungen sollen aber auch aus der Datei Suchnamen.txt entfernt werden, damit sie bei der nächsten Tabelle nicht wieder mit überprüft werden müssen. Somit werden nach und nach die Übereinstimmungen aus der Datei Suchnamen entfernt, so das danach nur noch die nicht übereinstimmenden Namen in der Datei Suchnamen vorhanden sind, womit sich dann auch obrige falsche Abfrage auf Nichtübereinstimmung erübrigt.
                      die suchbegriffe hast du doch schon in $SN = file ($SuchNam);

                      also wenn gefunden, einfach aus $SN rausschmeißen.
                      EDIT:
                      ELSE-Teill entfernt
                      Zuletzt geändert von 3DMax; 21.08.2008, 15:44.

                      Kommentar


                      • #12
                        Hallo 3DMax.

                        Kümmern Wir Uns doch erstmal um das vermeidlich einfachere.

                        Deinen Aussagen:

                        "die suchbegriffe hast du doch schon in $SN = file ($SuchNam);

                        also wenn gefunden, einfach aus $SN rausschmeißen.

                        EDIT:ELSE-Teill entfernt"

                        kann ich leider nichts konkretes entnehmen.
                        Ich habe versucht, das so umzusetze, leider ohne irgend eine Wirkung:

                        PHP-Code:
                                            if ($Prüf !== false) {
                                            
                        // Anweisungen für vorhanden
                                            
                        $Schreib file_put_contents ($TzO$zeile,FILE_APPEND);
                                            
                        $repl "";
                                            
                        $zeile str_replace ($zeile,$repl,$zeile);            
                                            } 
                        Kannst Du mir "rausschmeißen" programmiertechnisch etwas genauer darstellen?

                        Gruß
                        Estrela
                        Denk positiv.

                        Kommentar


                        • #13
                          Hallo 3DMax.

                          Vielleicht hätte ich erstmal die Eleganz Deines Ansatzes mit dem Array würdigen sollen, was ich hiermit gerne nachholen will.
                          Da ich aber so spontan nicht wusste, wie er einzubauen ist, wollte ich das vermeidlich leichtere erst mal angehen.
                          Möchte hier darauf aufmerksam machen, das das hier unter der Überschrift PHP-Anfänger läuft.
                          Und ich bin momentan nicht in der Lage, die gefundene Übereinstimmung in der Ursprungsdatei zu löschen. Aktuellster Versuch:
                          PHP-Code:
                                              if ($Prüf !== false) {
                                              
                          // Anweisungen für vorhanden
                                              
                          $Schreib file_put_contents ($TzO$zeile,FILE_APPEND);
                                              
                          $repl "";
                                              
                          $SN str_replace ($zeile,$repl,$SN);            
                                              } 
                          Hier verstehe ich nicht, warum die Anweisung nicht so läuft, wie ich sie mir vorstelle.
                          Mit $SN habe ich doch den Dateihandler, dann sage ich mit str_replace, das alle $zeile mit $repl in $SN zu ersetzen sind, womit die gefundenen Suchnamen gelöscht sein sollten.
                          Warum funktioniert das nicht?

                          Gruß
                          Estrela
                          Denk positiv.

                          Kommentar


                          • #14
                            Hallo zusammen.

                            Leider ist es mir immer noch nicht gelungen, die Übereinstimmungen aus der Datei Suchnamen.txt zu entfernen.
                            Der Code:
                            PHP-Code:
                                        foreach ($SN as $nr => $zeile) {
                                            
                            $zeile rtrim ($zeile);
                                            
                            $Prüf stripos($Text$zeile);
                                            echo (
                            $zeile."<br>");
                                                if (
                            $Prüf !== false) {
                                                
                            // Anweisungen für vorhanden
                                                
                            $zeile2 $zeile."\n";
                                                
                            $Schreib file_put_contents ($TzO$zeile2,FILE_APPEND);
                                                
                            $zeile "000";
                                                echo (
                            $zeile);
                                                
                            /*echo ($nr).'<br>';
                                                $repl = "";
                                                $Les = file_get_contents ($SuchNam);
                                                echo ($Les);
                                                $Lösch = str_replace ($zeile,$repl,$SuchNam);
                                                echo ($Lösch);
                                                $Lösch2 = file_put_contents ($SuchNam,$Lösch);*/            
                                                
                            }
                                            } 
                            Mit den beiden ersten echos ist es mir zwar gelungen, im Browser die Übereinstimmungen sichtbar zu machen, nützt aber nichts, weil im nächsten Durchlauf wieder alle Suchnamen überprüft werden.
                            Den zweiten Ansatz im auskommentierten Bereich konnte ich auch nicht erfolgreich durchführen, am Ende steht nur der Dateiname in $SuchNam.

                            Bin daher für alle konstruktiven Äußerungen dankbar, die das Script in Richtung Lösung wachsen lassen.

                            Gruß
                            Estrela
                            Denk positiv.

                            Kommentar


                            • #15
                              leute, bin ich hier alleinunterhalter?

                              Original geschrieben von Estrela
                              Hallo 3DMax.

                              Vielleicht hätte ich erstmal die Eleganz Deines Ansatzes mit dem Array würdigen sollen, was ich hiermit gerne nachholen will.

                              Mit $SN habe ich doch den Dateihandler, dann sage ich mit str_replace, das alle $zeile mit $repl in $SN zu ersetzen sind, womit die gefundenen Suchnamen gelöscht sein sollten.
                              Warum funktioniert das nicht?
                              wie kommst du darauf, dass $SN ein filehandle/resource ist? file() liefert ein array zurück! und selbst wenn es eine resource wäre, müsstest du den dateiinhalt nach dem schreiben auch wieder neu auslesen.

                              dann habe ich auch keine lobeshymnen erwartet, sondern dass du es alleine schaffst eine element aus dem array "rauszuschmeißen", nämlich mit unset($array[$key]);

                              ---
                              so, um jetzt noch ein bisschen verwirrung reinzubringen :

                              die empfehlung mit strip_tags() ziehe ich zurück und bei str_pos() würde ich dann nach '>'.$suchwort.'<' suchen, falls das suchwort teil eines anderen wortes ist.

                              EDIT:
                              wärst du nicht schon lange fertig, wenn du das manuell gemacht hättest?

                              Kommentar

                              Lädt...
                              X