Jan Hatterscheid: datei lesen ab einem stichwort

Ich moechte mit Perl eine Datei (Textdatei) auslesen. Wichtig ist jedoch, dass nur die Daten der Datei die nach dem wort <!--test--> folgen ausgelesen werden

Also z.B.

Jan
Test1
Test2
Test3
<!--test-->
Test4
Test5
Test6

Das Script dürfte also nur Test4, Test5 und Test6 auslesen.

Wie kann ich das machen?
Danke
Jan

  1. Ich moechte mit Perl eine Datei (Textdatei) auslesen. Wichtig ist jedoch, dass nur die Daten der Datei die nach dem wort <!--test--> folgen ausgelesen werden

    Eine kleiner Parser also. Ganz einfach: Ohne jetzt einen Code zu liefern - Such den String <!--test--> ... splitte an der Stelle .... wirf den ersten Teil weg ... uebrig bleibt das Was Du willst.

    Viele Gruesse

    1. Hi,

      open(TXT,"name.txt") or die "Fehler beim Öffnen";
      es_kann_los_gehen = false;

      while ($line = <TXT>) {
        if (es_kann_los_gehen) {
          print $line;
        }
        if ($line eq "<!--test-->") {
          es_kann_los_gehen = true;
        }
      }

      Dieser Code ließt das File Zeile für Zeile ein. Falls die gewünschte Zeile eingelesen wurde, wird
      es_kann_los_gehen auf true gesetzt. Bei jeder Zeile wird
      außerdem zuerst überprüft, ob diese Variable schon true
      ist - wenn ja, dann wird die Zeile ausgegben.

      Grüße
        fredy

      Ich moechte mit Perl eine Datei (Textdatei) auslesen. Wichtig ist jedoch, dass nur die Daten der Datei die nach dem wort <!--test--> folgen ausgelesen werden

      Eine kleiner Parser also. Ganz einfach: Ohne jetzt einen Code zu liefern - Such den String <!--test--> ... splitte an der Stelle .... wirf den ersten Teil weg ... uebrig bleibt das Was Du willst.

      Viele Gruesse

      1. Hi,

        ein wenig suboptimal (viele Wege führen bekanntlich nach Rom), ich poste mal 'ne andere Version:

        open(TXT,"name.txt") or die "Fehler beim Öffnen: $!";
        $line = "";
        while (($line = <TXT>) && ($line !~ /<!--test-->/)) { }
        while ($line = <TXT>) {
           print $line;
        }
        close(TXT);

        So spart man sich die regelmäßige if-Abfrage, was gerade bei großen Dateien eine deutlich bessere Zeitausbeute gibt. Die zweite while-Schleife kann man auch einfach durch
        @text = <TXT>;
        ersetzen, dann wird der Rest der Datei in das Array @text geladen und kann beliebig weiter verwendet werden. Übrigens habe ich die Abfrage (zeitlich nicht mehr optimal) mit einer RegExp gelöst, weil eine Zeile gewöhnlich auf \n endet. Man könnte das durch "(chomp($line) ne "<!--test-->")" optimieren. Zudem bin ich mit der Abfrage, ob die Datei noch Daten enthält, nicht ganz zufrieden. Gibt es eigentlich EOF?

        Cheatah

        1. Hi! (Sorry, aber den kann ich mir jetzt nicht verkneifen ..)

          ein wenig suboptimal (viele Wege führen bekanntlich nach Rom), ich poste mal 'ne andere Version:

          Auf der Straße kommt man aber doch etwas schneller voran, als auf der direkten Luftlinie durch Felder und Wiesen zu stapfen ;-)

          Wie wär's denn mit:

          open(TXT,"name.txt") or die "Fehler beim Öffnen: $!";
          $/='<!--test-->';
          $anfang = <TXT>;
          $/='';
          while ($line = <TXT>) {
             print $line;
          }
          close(TXT);

          So spart man sich die regelmäßige if-Abfrage, was gerade bei großen Dateien eine deutlich bessere Zeitausbeute gibt.

          SOoo (klappts auch mit dem Nachbarn) spart man sich das regelmäßige Patternmatching, was gerade bei großen Dateien eine deutlich bessere Zeitausbeute gibt ...

          Na ja! Ganz so brutal besser wird meine Lösung wohl auch nicht sein. Ich weiß ja auch nicht, wie die Sache mit dem Input-Separator intern gelöst ist.

          Und ich dachte Du kannst inzwischen perldoc perlvar in- und auswendig ;-)

          Cheatah

          Nichts für ungut,
             Jörk

          1. Hi,

            ein wenig suboptimal (viele Wege führen bekanntlich nach Rom), ich poste mal 'ne andere Version:

            Auf der Straße kommt man aber doch etwas schneller voran, als auf der direkten Luftlinie durch Felder und Wiesen zu stapfen ;-)

            das ist wahr, aber man muß sich ja nicht gleich mit einem Katapult ans Ziel schießen lassen ;-)

            Wie wär's denn mit:

            open(TXT,"name.txt") or die "Fehler beim Öffnen: $!";
            $/='<!--test-->';
            $anfang = <TXT>;
            $/='';

            Wohl eher $/ = '\n'; oder?

            Jedenfalls ist das Konzept ziemlich genial. Zwar (aus meiner Sicht) etwas gewagt, vor allem wenn '<!--test-->' auch innerhalb einer Zeile auftauchen kann, aber gut.

            Und ich dachte Du kannst inzwischen perldoc perlvar in- und auswendig ;-)

            Nein, gerade perlvar muß ich immer wieder zu Rate ziehen... :-)

            Cheatah

            1. Hallo nochmal,

              ein wenig suboptimal (viele Wege führen bekanntlich nach Rom), ich poste mal 'ne andere Version:

              Auf der Straße kommt man aber doch etwas schneller voran, als auf der direkten Luftlinie durch Felder und Wiesen zu stapfen ;-)

              das ist wahr, aber man muß sich ja nicht gleich mit einem Katapult ans Ziel schießen lassen ;-)

              Nun ja, ich bin zwar angekommen, habe aber doch einen kleinen Krater hinterlassen. Die die nach mir kommen haben es dann ein bisschen schwerer ...

              Anders gesagt, mit $/ = "\n" hast Du natürlich vollig recht. Ich hatte bei meinem Schnellschuß ;-) nur noch die Sonderfunktion von $/ = '' im Kopf - war aber gar nicht das, was gebraucht wurde. (hiermit kann man absatzweise einlesen nicht aber zeilenweise).

              Wie wär's denn mit:

              open(TXT,"name.txt") or die "Fehler beim Öffnen: $!";
              $/='<!--test-->';
              $anfang = <TXT>;
              $/='';

              Wohl eher $/ = '\n'; oder?

              Mit dieser Variante würdest Du nach dem String \n suchen ;-)

              Jedenfalls ist das Konzept ziemlich genial. Zwar (aus meiner Sicht) etwas gewagt, vor allem wenn '<!--test-->' auch innerhalb einer Zeile auftauchen kann, aber gut.

              Soll es das denn in diesem Fall oder eher nicht? Man hat ja auch die Möglichkeit, Returns mit anzugeben. Hier muß man allerdings mit dem DOS/Unix Unterschieden aufpassen...

              Jörk