Aus Datei Textblöcke in neue Datei speichern

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

  • Aus Datei Textblöcke in neue Datei speichern

    Hallo,
    mein erster Post hier...

    Ich lese eine Datei ein und möchte bestimmte Textblöcke dieser Datei
    wieder in eine neue Datei abspeichern, wobei zwischen den einzelnen
    Blöcken eine Leerzeile sein muss.

    Beispiel

    Inhalt der Quelldatei: Beispieldatei

    Inhalt der Zieldatei
    Code:
    SM 791200
    AAXX 09336
    09780 1//// /0000 10180 20154 3//// 49978 53000 60021 700//
    333 5//// 
    555 10000
    666 10180 20152=
    NNNN
    
    SN 191200
    AAXX 09556
    09780 1//// /0000 10180 20154 3//// 49978 53000 60021 700//
    333 5//// 
    555 10000
    666 10180 20152=
    NNNN
    
    ...usw...
    Hier nun meinen PHP-Fetzen,
    der leider keinen SM Block erkennt und am Ende
    den falschen Block mit den 2x NNN einliest.

    PHP-Code:
    <?php 

    $synopurl 
    "http://www.namoro.de/test/synop1.txt";

    $openFile fopen("$synopurl""r");

    $retrieveFile fread($openFile10000);

    fclose($openFile);

    $c=$retrieveFile

    $a=explode("SN ",$c); 

    for(
    $n=1;$n<sizeof($a);$n++){ 

       
    $b=explode("NNNN",$a[$n]); 
     
          echo 
    $b[0]."<br>"



    echo 
    "<br><br>"."fertig";

    ?>
    Ich hatte mir schon Doku's bezüglich regulären Ausdrücken angeschaut,
    hierbei jedoch einige graue Haare bekommen

    Gruss und danke

    Roland

  • #2
    Re: Aus Datei Textblöcke in neue Datei speichern

    einfachste Möglichkeit
    File einlesen als Array
    Zeile für Zeile überprüfen, ob die ersten 3 Zeichen == "SM " sind, dann einlesen bis eine Zeile leer ist und dann weiterprüfen!

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      Hallo,
      jo, kann jemand hierzu ein kleines Code-Snippet posten?

      Gruss
      Roland

      Kommentar


      • #4
        PHP-Code:
        $datei file("pfad_zu_deiner_datei");
        $return = array();

        for (
        $i 0$index 0$size count($datei); $i $size$i++)
        {
         if (
        substr($datei[$i], 03) == 'SM ')
         {
          
        $return[$index] = $value;
          do {
           ++
        $i;
           if (
        $datei[$i] != ''$return[$index] .= "\n" $datei[$i];
          } while (
        $datei[$i] != '')
          ++
        $index;
         }

        oder so...sollte natürlich einer deiner "ignorier"-Blöcke in einer Zeile mit "SM " anfangen, funkt der Code nicht...

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          Hmmm,
          wo soll die Variable $value gefüllt werden?

          Gruss
          Roland

          Kommentar


          • #6
            PHP-Code:
            $datei file("pfad_zu_deiner_datei");
            $return = array();

            for (
            $i 0$index 0$size count($datei); $i $size$i++)
            {
             if (
            substr($datei[$i], 03) == 'SM ')
             {
              
            $return[$index] = $datei[$i]
              do {
               ++
            $i;
               if (
            $datei[$i] != ''$return[$index] .= "\n" $datei[$i];
              } while (
            $datei[$i] != '')
              ++
            $index;
             }

            öh...gar nicht XD~
            so sollte es aber gehen (hab zuerst an ne foreach-Schleife gedacht und hab mich dann wieder umentschieden...)

            Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

            bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
            Wie man Fragen richtig stellt

            Kommentar


            • #7
              So,
              habe dies mal hinbekommen,
              leider werden die Daten aber nicht wie oben beschrieben selektiert:

              Output des nachfolgenden Script
              http://namoro.de/test/test1.php
              PHP-Code:
              <?php 

              $synopurl
              ="http://www.namoro.de/test/synop1.txt";

              $datei file$synopurl );
              $return = array();

              for (
              $i 0$index 0$size count($datei); $i $size$i++)
              {
               if (
              substr($datei[$i], 03) == 'SM ')
               {
                
              $return[$index] = $datei[$i];
                do {
                 ++
              $i;
                 if (
              $datei[$i] != ''$return[$index] .= "<br>" $datei[$i];
                } while (
              $datei[$i] != '');
                ++
              $index;
               }
              }

              echo 
              $return[0];

              echo 
              "<br>"."fertig";

              ?>
              Das Script beginnt zwar bei "SM " hört aber nicht nach "NNNN" auf.

              Das nachfolgende Script funktioniert schon besser,
              leider wird hier aber ein 'defekter' Block mitselektiert:

              Output des nachfolgenden Script
              http://namoro.de/test/test.php
              PHP-Code:
              <?php 

              $synopurl
              ="http://www.namoro.de/test/synop1.txt";
              $datei="";
              $block="0";

              $fp=fopen($synopurl,"r");
                
              while(
              $line=fgets($fp,1024))
               {

                if( (
              substr($line03) == 'SN ' and $block !== "1") or (substr($line03) == 'SM ' and $block !== "1") )

                 {
                 
              $block "1";
                 
              $datei .= "$line"."<br>";
                 }
                elseif(
              substr($line04) != 'NNNN' and $block == "1")
                 {
                   
              $datei .= "$line"."<br>";
                 }
                elseif(
              substr($line04) == 'NNNN' and $block == "1")
                 {
                   
              $block "0";
                   
              $datei .= "$line"."<br><br>";
                 }
               } 

              echo 
              "$datei";

              fclose($fp);

              ?>
              Das Script soll bei "SN " oder "SM " beginnen und bei "NNNN" aufhören zu selektieren
              und danach in der Datei weitersuchen bis zum nächsten "SN " oder "SM " usw.

              Findet das Script aber nach "SN " oder "SM " wieder "SN " oder "SM ",
              war dieser Block fehlerhaft und es beginnt gerade ein neuer Block.

              Puhhhh, ziemlich kompliziert zu erklären.

              Nochmal im komprimierter Form:

              - selektiere in der obigen Datei den ersten "SN " oder "SM " bis inclusive "NNNN" Block
              - schreibe diesen Datenblock in eine Variable
              - selektiere in der obigen Datei den nächsten "SN " oder "SM " bis inclusive "NNNN" Block
              - schreibe diesen Datenblock in eine Variable
              usw. bis zum Dateiende

              Gruss
              Roland
              Zuletzt geändert von lollol; 19.08.2005, 23:13.

              Kommentar


              • #8
                - selektiere in der obigen Datei den ersten "SN " oder "SM " bis inclusive "NNNN" Block
                - schreibe diesen Datenblock in eine Variable
                - selektiere in der obigen Datei den nächsten "SN " oder "SM " bis inclusive "NNNN" Block
                - schreibe diesen Datenblock in eine Variable (musst du noch selber machen )
                schiddebön ....

                PHP-Code:
                <?php

                  
                // datei einlesen
                  
                $data implode(''file('http://www.namoro.de/test/synop1.txt'));

                  
                // daten finden
                  
                preg_match_all('!S[M|N](.*)NNNN!sU'$data$ma);

                  
                // gefundene daten als array
                  
                echo '<hr size=1><pre>'.print_r($ma[0],true).'</pre>';

                  
                // das ist das, was du dann in eine datei schreiben kannst.
                  
                $data2write implode("\n\n"$ma[0]);
                  echo 
                '<hr size=1><pre>'.$data2write.'</pre>';

                  
                // kontrollausgabe der originaldaten
                  
                echo '<hr size=1><pre>'.$data.'</pre>';

                ?>
                man könnte die regex noch entsprechend erweitern, dass das SM/SR und das NNNN auch immer am zeilenanfang ist. aber da steige ich auch nicht so ganz durch ....
                INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                Kommentar


                • #9
                  vielleicht noch mit str_word_count() jedes array-element daraufhin untersuchen, ob SN/SM mehr als einmal vorkommt. in dem fall die regex nochmal auf das element anwenden ... frei nach dem motto: die guten ins töpfchen (array), die schlechten ... ins nirwana
                  Kissolino.com

                  Kommentar


                  • #10
                    evtl ist diese regex genauer .... in der theorie muss nun das SN/SM unbedingt am zeilenanfang stehen und das NNNN muss einem zeilenumbruch folgen.

                    PHP-Code:
                    // daten finden
                    preg_match_all("!^S[M|N](.*)\nNNNN!smU"$data$ma); 
                    probier es mal aus .....
                    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                    Kommentar


                    • #11
                      Hi,
                      danke, scheint zu funktionieren.

                      - werde nun mal gründlich testen

                      - aber die regex ist mir schleierhaft, da schlafe ich mal eine Runde drüber

                      Gruss
                      Roland

                      Kommentar


                      • #12
                        Darf ich mal fragen, was das eigentlich für eine komische Text-datei ist? Oo

                        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                        Wie man Fragen richtig stellt

                        Kommentar


                        • #13
                          Hi ghostgambler,
                          klar darfst du fragen

                          begin

                          Die Quelldatei beinhaltet Synop-Meldungen (Synoptics) incl. dem Mailheader und
                          anderen unnötigen Informationen von privaten Wetterstationen.

                          Diese Meldungen kann ich nun nach den eigentlichen Synopdaten filtern
                          und im 'rein'-Format wieder abspeichern.

                          Synop's beinhalten die Ddaten von z.B. Temperatur, Feuchte,
                          Windgeschwindigkeit, Bewölkungsgrad usw. in 'verschlüsselter' Form.

                          Ausfühliche Erklärung des Synop-Codes

                          end

                          Gruss
                          Roland

                          Kommentar


                          • #14
                            Hi,
                            aber kann mir mal einer die regex ganz lieb erklären:

                            [COLOR=red]"!^S[M|N](.*)\nNNNN!smU"[/COLOR]

                            S[M|N] sowie NNNN kann ich ja noch nachvollziehen...

                            Gruss
                            Roland

                            Kommentar


                            • #15
                              suche ein S am zeilenanfang, gefolgt von einem N oder M.
                              nimm alles dahinter, bis ein zeilenumbruch gefolgt von NNNN kommt.

                              preg_match_all() findet alle diese gesuchten werte und speichert es in einem array ab.
                              INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                              Kommentar

                              Lädt...
                              X