Texdatei durchsuchen nach bestimmten STRING

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

  • Texdatei durchsuchen nach bestimmten STRING

    Hallo,

    ich möchte folgendes Problem posten.

    zugrundeliegende Textdatei (Ausschnitt):

    Code:
    * Einführungstext
    ORIA    36 4490697.497 5922175.080  1178.505   2.5268  -0.7971 
    ORIA    37 4490371.312 5922270.142  1181.886   2.0299   0.3653 
    ORIA    38 4490044.270 5922366.589  1184.754   2.9589   0.2473 
    ORIA    39 4489718.426 5922460.573  1186.111   1.6081  -1.4088 
    ORIA    40 4489386.534 5922550.304  1183.751   0.2137   1.2394 
    ORIA    41 4489055.174 5922624.307  1189.336   0.0229   2.9818 
    CORD    301 4490545.023 5921834.505    49.191  0.035  0.063  0.185
    CORD    302 4490274.377 5921946.162    50.038  0.028  0.039  0.130
    Ich möchte diese Datei mit dem Namen "itera.txt" nun zeilenweise einlesen,
    jedoch nur die Dateikomponenten ausgeben und weiterverarbeiten die hinter dem STRING "ORIA" vorkommen.
    Diese sind jeweils durch ein "WhiteSpace" getrennt.

    CODE für das zeilenweise Einlesen:
    PHP-Code:
    <?php 
    //DATEI NUR ZUM LESEN ÖFFNEN
    $datei fopen('itera.txt','r'); 

    //ZEILENWEISE DURCH DIE DATEI GEHEN: 
    while (!feof($datei)) 
       { 
       
    $zeile fgets($datei,1024); 
       echo 
    $zeile.'<br>'
       } 
    ?> 
    <hr> 
    <?php 
    //DATEI WIEDER SCHLIESSEN: 
    fclose($datei); 
    ?>
    Und bei diesem Einlesen soll gleichzeitig auf den STRING "ORIA" geprüft werden, so dass nicht alle Zeilen ausgegeben werden, sondern nur die besagten mit "echo $zeile".

    Ich habe noch ein kleines Script dazu geschrieben, welches aber nicht das macht was es soll
    PHP-Code:
    <?php
    $handle 
    file_get_contents("itera.txt");
    $lookfor '#ORIA(.+)}#s';

    preg_match_all($lookfor$handle$matches);
    print_r($matches);
    ?>
    Hat jemand eine Idee?

    Viele Grüße

    Maxe
    Zuletzt geändert von Maxe80; 05.05.2006, 17:03.

  • #2
    Re: Texdatei durchsuchen nach bestimmten STRING

    PHP-Code:
      $content = @file_get_contents('datei.txt');
      
    $regex "/ORIA    ([0-9]+) ([.0-9]+) ([.0-9]+)  ([.0-9]+)   ([.0-9]+)  ([-.0-9]+)/iU";
      if (
    preg_match_all($regex,$content,$matches,PREG_SET_ORDER))
      {
        foreach(
    $matches as $match)
        {
        
    // ausgabe
        
    }
      } 
    Die frage ist natürlich nun, bleiben die leerräume zwischen den zahlen immer gleich ? und brauchst du jede zahlengruppe einzeln ?

    Das obige beispiel klappt, wenn die ausgabe der zeilen die spaces immer beibehält, ansonsten muss man dann mit {1,2} die Leerzeichen der zwischenräume bestimmen > sonst gibt's nen Fehler.

    die if abfrage am anfang stellt sicher das auch nur die Daten die dem suchmuster entsprechen, ausgegeben werden !
    Zuletzt geändert von boris-schneider; 05.05.2006, 17:32.

    Kommentar


    • #3
      Hallo Boris,

      vielen Dank für die schnelle Hilfe.

      Ich werde den Code gleich testen.

      Das ASCII-File kommt aus einem System.
      Die Leerräume bleiben immer gleich, nur der Output ist variabel, so dass immer erst nach dem besagten STRING gesucht werden muss.

      Wie verarbeite ich die Zahlen denn einzeln. weißt du wie das funktioniert?

      Viele Grüße
      Zuletzt geändert von Maxe80; 05.05.2006, 17:44.

      Kommentar


      • #4
        So hier mein funktionierender CODE:
        PHP-Code:
        <?php 
        //DATEI NUR ZUM LESEN ÖFFNEN, DATEIZEIGER STEHT AM ANFANG: 
        $datei fopen('../upload/web/itera.txt','r'); 

        //ZEILENWEISE DURCH DIE DATEI GEHEN: 
        while (!feof($datei)) 
           { 
           
        //GANZE ZEILE ALS EINEN STRING EINLESEN; DIE ZAHL GIBT DIE MAXIMALE LÄNGE IN BYTE AN: 
           
        $zeile fgets($datei,1024); 
           
        $regex "/ORIA    ([0-9]+) ([.0-9]+) ([.0-9]+)  ([-. .0-9]+)   ([-. .0-9]+)  ([-. .0-9]+)/iU";
          if (
        preg_match_all($regex,$zeile,$matches,PREG_SET_ORDER))
          {
            foreach(
        $matches as $match)
            {
            echo 
        $zeile.'<br>';
            }
          } 
         } 
        //DATEI WIEDER SCHLIESSEN: 
        fclose($datei); 
        ?>
        Funktioniert wunderbar. Ich bin für die Hilfe sehr dankbar.

        Nun jedoch zurück zur Zahlengruppe. Mein Ziel ist es nun die einzelnen Zahlenwerte auszulesen und in ein Formular zu übertragen. So dass entsteht:

        Die CODEZEILE nochmal:

        Code:
        ORIA    36 4490697.497 5922175.080  1178.505   2.5268
        Formular:

        TextFeld1 36
        TextFeld2 4490697.497
        TextFeld3 5922175.080 ....

        Da bin ich gerade am knobeln bei.

        Kommentar


        • #5
          bau mal in die foreach ausgabe das hier ein
          PHP-Code:
          echo '<pre>';
          print_r($match);
          echo 
          '</pre>'
          Das ergebnis ist selbsterklärend

          Kommentar


          • #6
            Das hat auch super geklappt. Vielen Dank. Der Code ist drinn.

            Weitere Frage:

            Weiß jemand, wie ich innerhalb einer foreach-Schleife die ausgelesenen Parameter direkt an eine andere Datei zum verarbeiten schicken kann?

            Kommentar


            • #7
              in ne Session packen und dann (nach der Schleife) per header Location

              Kommentar


              • #8
                Habe ich mit header() probiert. Klappt nicht. Kann man diese Funktion nicht nur am Anfang einer Datei nutzen?

                PHP-Code:
                header(Locationdatei.php?Parameter); 
                Hast du vielleicht einen Codeschnipsel für mich Koala?

                Kommentar


                • #9
                  Schonmal was von Strings gehört?!?

                  Und nach Location muß eine absolute URI angegeben werden, also http://example.com/pfad/datei.php.

                  Kommentar


                  • #10
                    Hallo,

                    ich habe es mit SESSION und der header Funktion probiert. Ich erhalte jedoch den Fehler

                    Code:
                    Warning: Cannot modify header information - headers already sent by (output started at itera2xml.php:9) in itera2xml.php on line 30
                    PHP-Code:
                    foreach(...... as ....)
                    {
                     
                    //Anweisung
                    }
                    header("Location: URL+datei.php"); 
                    Was mache ich falsch? Es funktioniert nicht.

                    Kommentar


                    • #11
                      Original geschrieben von Maxe80
                      Was mache ich falsch?
                      Auch du hast den Sticky Thread in diesem Forum nicht beachtet, in dem dieses schon unzählige Male diskutierte und auch im Manual deutlich erklärte "Problem" für die Merkbefreiten noch mal erläutert wird.
                      I don't believe in rebirth. Actually, I never did in my whole lives.

                      Kommentar


                      • #12
                        Die Frage ist ja:

                        Was willst Du erreichen?

                        Eine Datei einlesen und die Daten weiterverarbeiten.

                        Sollen die Daten vorher ausgegeben werden
                        oder erst in dem Formular?

                        Wenn sie erst im Formular ausgegeben werden,
                        zu was brauchst Du dann ne Weiterleitung?

                        Ich würds so machen:

                        Formulardaten prüfen

                        wenn ok -> alles weitere

                        wenn nicht -> Datei einlesen und Formular anzeigen.

                        Kommentar


                        • #13
                          Ich denke, ich habe den Fehler gefunden.

                          Vor einem header, darf keine Ausgabe erzeugt werden.

                          Die Warnung tritt immer dann auf,
                          wenn vor dem Aufruf der header-Funktion
                          eine Ausgabe “gesendet” wurde und das ist bei mir der Fall.

                          Dann ist es für mich die falsche Option.

                          Das Formular ist nur eine Variante.
                          Wenn ich ein Textfile (siehe oben) einlese
                          und dies mit 100 gar 1000 Zeilen gefüllt ist,
                          möchte ich dem Nutzer das ewige geklicke
                          im Formular ersparen und den Prozess
                          automatisiert durchlaufen lassen.
                          Am Ende wird diese Textdatei in eine XML-Datei umtransformiert.
                          Für jede "ORIA"-Zeile (siehe CODE oben)
                          wird dann ein eigenes kleines XML-File erstellt etc..
                          Dieses kleine XML file wird dann einer größeren XML-Datei angehängt usw. Das nur zum Hintergrund.

                          Wichtig ist mir, dass die Daten innerhalb der Schleife direkt
                          an eine PHP-Datei gesendet werden,
                          die hinten ein XML-File ausspuckt.
                          Das ist alles fertig. Ich bastele jetzt nur noch an dem Automatisierungsprozess.

                          Code:
                          Foreach-Schleife ausführen --> Parameter auslesen --> Weiterschicken zur Generierung des XML-Outputs
                          Danke für Eure Mithilfe.
                          Zuletzt geändert von Maxe80; 09.05.2006, 10:45.

                          Kommentar


                          • #14
                            Hallo,

                            kann mir jemand bei folgendem Problem bitte helfen die einzelnen Strings auszulesen.

                            Textdatei:
                            Code:
                            ORIA    38 4490044.270 5922366.589  1184.754   2.9589    0.2473 
                            ORIA    39 4489718.426 5922460.573  1186.111   1.6081   -1.4088
                            ORIA    40      12.559      11.089     8.624 -17.3298   73.4098
                            ORIA    41      13.174      11.402     8.579 -45.0145   75.9854

                            Ich versuche es mit dem Code:

                            PHP-Code:
                            $regex "/ORIA ([ 0-9]+) ([ .0-9]+) ([ .0-9]+)  ([ .0-9]+) ([ -.0-9]+) ([-. 0-9]+)/i"
                            Bekomme jedoch das
                            Code:
                            Array
                            (
                                [0] => ORIA    36 4490697.497 5922175.080  1178.505   2.5268  -0.7971 181.9945   
                                [1] =>    36
                                [2] => 4490697.497 5922175.080 
                                [3] => 1178.505 
                                [4] => 2.5268 
                                [5] => -0.7971
                                [6] =>  
                            )
                            Der Fehler ist in ARRAY[2] zu sehen. Dort werden zwei Parameter ausgegeben, was aber nicht so sein soll. Alles wird durch eine falsche Einstellung verschoben. Kann mir jemand bei den regulären Ausdrücken helfen?

                            Gruß Maxe

                            Kommentar


                            • #15
                              dieser Regex ersetzt alle Leerzeichen die mehr als einmal
                              vorkommen durch ein einziges Leerzeichen:

                              $result = preg_replace('/ {2,}/', ' ', $subject);

                              Das Array erzeugst Du dann mit $erg = explode(" ", $result);

                              Kommentar

                              Lädt...
                              X