Paul: wie Zeichenfolge an x-ter Stelle auslesen?

Hallo zusammen!

Ich möchte gerne einen Viewer für eine Log-Datei schreiben, die folgendes Format hat:
blablabla|dudidu|langertext|kurzertext|blubb usw.

Ich weiß aber nicht, wie ich die Zeichenfolgen zwischen den senkrechten Strichen auslesen soll, da sie alle unterschiedlich lang sind.
Kann mir jemand sagen, wie ich das mache?

Vielen Dank!
Paul

  1. Hallo Paul!

    Du kannst das mit dem Befehl "split" machen.
    Mehr dazu findest Du hier:
    http://www.web-netz.de/workshops/perl/split.html

    Hoffe ich konnte hlefen

    MfG
    Christof

  2. Hi Paul,

    ich kann dir jetzt nur einen Ansatz für PHP nennen.

    • die Datei mittels var $array = file('./datei.txt'); einlesen die Funktion liest jede Zeile der datei in ein ARRAY ein.

    dann in einer Schleife ausgeben und am Trennzeichen trennen.

    ----------
    foreach($array AS $elem)
    {
        var $teil = preg_split('|', $elem)

    forech($teil AS $einzel)
        {
            echo $einzel . "<br />\r\n";
        }
    }
    ----------

    1. Hi,

      ops lasse die beiden "var" weg war gerade wo anders. ;-)

      1. Hi,

        nachmal das ganze waren ja noch zwei fehler drin, tut mir leid.

        ----------
        $array = file('./datei.txt');

        foreach($array AS $elem)
        {
            $teil = preg_split('|', $elem);

        foreach($teil AS $einzel)
            {
                echo $einzel . "<br />\r\n";
            }
        }
        ----------

        1. Hallo René,

          $teil = preg_split('|', $elem);

          für was brauchst du hier preg_split? ein explode würde doch völlig ausreichen ...

          Grüße aus Nürnberg
          Tobias

          --
          Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
          1. Hi Tobias,

            für was brauchst du hier preg_split?

            Ich habe mir sagen lassen das preg_... schneller ist.

            1. Hallo René,

              für was brauchst du hier preg_split?
              Ich habe mir sagen lassen das preg_... schneller ist.

              schneller als split, ja - aber nicht als explode da explode keine regulären Ausdrücke verwendet (siehe den Kasten "Tipp" auf http://de.php.net/split)

              Grüße aus Nürnberg
              Tobias

              --
              Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
              1. Hi Tobias,

                gemerkt für alle Ewigkeiten! Wüßte nicht das explode(); in dem Fall doch besser geeignet ist. Danke für die Info.

                Gruß
                René

  3. Hallo!

    Danke für die schnellen Antworten.

    @René: Da ich kein PHP spreche, wollte ich das in Perl realisieren... ;-)

    Bin bis jetzt so weit:

    open(LOG, "<log.txt");
    @log = <LOG>;
    close(LOG);
    @test = split(/|/, $log);
    $eins = $test[0];
    $zwei = $test[1];
    .
    .
    .

    Habe jetzt aber noch eine Frage.
    In der Log-Datei steht jeder Eintrag in einer neuen Zeile, also in jeder Zeile wieder blablabla|dudidu|langertext|kurzertext|blubb.
    Muss ich dann jede Zeile in einen neuen Array packen, bevor ich sie splitten kann? Das wäre aber arg umständlich...

    1. Hi Paul,

      mein Prob. ist das ich Perl nur ansatzweise kann.

      gibt es den in Perl nichts vergleichbares wie in PHP das file('...');

      Dort wird ja schon jede Zeile in einem Array-Element gespeichert. Und dann kann man ja in zwei verschachtelten Schleifen das ausgeben. Siehe mein Post ( eh drei posts weil Fehler in den anderen beiden :-) ).

      Gruß
      René

    2. hi!

      open(LOG, "<log.txt");
      @log = <LOG>;
      close(LOG);
      @test = split(/|/, $log);

      Also das ist in mehrerlei Hinsicht falsch: Erstens ist der Pipe | in
      regulaeren Ausdruecken mit einer Sonderfunktion behaftet, naemlich
      zur Unterscheidung von Alternativen, und muss damit maskiert werden.
      Zweitens sind @log und $log voellig unterschiedliche Variablen, die
      nichts miteinander zu tun haben.

      In der Log-Datei steht jeder Eintrag in einer neuen Zeile, also in
      jeder Zeile wieder blablabla|dudidu|langertext|kurzertext|blubb.
      Muss ich dann jede Zeile in einen neuen Array packen, bevor ich
      sie splitten kann? Das wäre aber arg umständlich...

      open LOG, "<log.txt";
      @log = <LOG>;
      close LOG;

      Jetzt hast du ein Array @log, in dem _alle_ Zeilen der Datei log.txt
      stehen. Jeden einzelnen Eintrag aus diesem Array kannst du splitten
      und erhaelst dann pro Zeile ein Array, das aus den durch | getrennten
      Werten besteht:

      foreach $line (@log) {
        @values = split /|/, $line;
      }

      Alternativ kannst du statt @values auch eine zusammengesetzte Liste
      aus skalaren Variablen verwenden:

      foreach $line (@log) {
        ($eins, $zwei, $drei) = split /|/, $line;
      }

      Die Verarbeitung der erhaltenen Werte musst du dann ebenfalls in der
      foreach-Schleife erledigen.

      bye, Frank!

      --
      Never argue with an idiot. He will lower you to his level and then
      beat you with experience.