easy: Mehrzeilige Textdatei auslesen und formatiert ausgeben

Hallo Leute!

Ich habe ein Problem mit dem Verarbeiten von XML-ähnlichen Dateien. Unsere interne Datenbank generiert Dateien mit folgendem Inhalt:

|hook base vers="1.0"|
|entries|
 |sel event="5214-5 A25 C" id="d 346735" left="54" base="k"|beliebiger
mehrzeiliger
Beschreibungstext|/sel|
 |sel event="5285-4 A26 C" id="d 543643" left="2" base="l"|beliebiger

mehrzeiliger

Beschreibungstext|/sel|
...
|/entries|

Meine Aufgabe ist es nun, ohne diese Dateien zu verändern, ein passendes Verarbeitungsskript in Perl zu schreiben, um die Daten in den Files im Web formatiert sichtbar zu machen. Also habe ich mal etwas rumexperimentiert, allerdings keine richtige Lösung gefunden.

hier mein Ansatz in Perl:

open(QUELLE,"<back2648.dat") || die "Quelle nicht gefunden";
while(<QUELLE>){
    $in = $_;
    unless(lc($in) eq "|entries|" or lc($in) eq "|/entries|" or lc($in) eq '|hook base vers="1.0"|'){
      my $sub = $in =~ /event="(.+?)"/;
      $dat[$count][0] = $1;
      my $sub = $in =~ /id="(.+?)"/;
      $dat[$count][1] = $1;
      my $sub = $in =~ /left="(.+?)"/;
      $dat[$count][2] = $1;
      my $sub = $in =~ /base="(.+?)"/;
      $dat[$count][3] = $1;
      my $sub = $in =~ /|sel(.+?)|/sel|/;
      $dat[$count][4] = $1;
      $count++;
    }
}
close(QUELLE);

Ihr seht also, daß ich versucht habe, die beliebigen Zeichen im Eintrag |sel event...| auszulesen und in ein Array zu kopieren. Den Text zwischen |sel... und |/sel| ebenfalls. Ich habe nun überlegt, daß es nicht funzt, weil mit der while-funktion ja jede Zeile der <QUELLE> einzeln durchlaufen und somit nix gefunden wird. Aber wie kann ich es anders lösen?

Bin für jede Hilfestellung dankbar!

Ciao

  1. hi,

    Ihr seht also, daß ich versucht habe, die beliebigen Zeichen im Eintrag |sel event...| auszulesen und in ein Array zu kopieren. Den Text zwischen |sel... und |/sel| ebenfalls. Ich habe nun überlegt,

    =cut
    $t = qq(

    Es war einmal eine kleine Made die nicht hören wollte.... und
    so gefiel diese Made einer |sel|

    Ameise als Speise |/sel|

    Punkt);

    $t =~ /|sel|(.*)|/sel|/s;

    print $1; # Ameise als Speise
    =cut

    Du bekommst so das zwischen |sel| und |/sel| Geschriebene.
    Vorher nimmst Du die Datei auf einen string, geht so:

    open IN, "c:/windows/services" or die $!;
    $/ = undef; # important ! wischdig !
    my $filebody = <IN>;
    close IN;

    Gruss, Rolf

    --
    KnowHow veröffentlichen statt patentieren!
  2. Ihr seht also, daß ich versucht habe, die beliebigen Zeichen im Eintrag |sel event...| auszulesen und in ein Array zu kopieren.

    Hallo
    dein $count wird sich nicht so verhalten wie du denkst
    und zwar weil deine <Quelle> zeilenweise eingelesen wird, deine Beitragstexte aber über Zeilen hinweg gehen.

    my $bunch = join(<QUELLE>); #jetzt hast du das Zeilenproblem weg

    und da hast du alles in einem String.
    Nun trennst du so, dass deine Einträge auch einen logischen Zähler haben werden.
    du kannst nach |sel suchen und dies in einer Schleife abhandeln.

    my $count = 0 ;
    while ($bunch =~ /(|sel.*?|/sel)/g) {
      my $in = $1;
      # mach was mit $in
      $count++;
    }

    jetzt zählt $count effektiv jeden deiner Einträge.

    mfg Beat

  3. use Mosche;

    Ich habe ein Problem mit dem Verarbeiten von XML-ähnlichen Dateien. [...]
    Meine Aufgabe ist es nun, ohne diese Dateien zu verändern, ein passendes Verarbeitungsskript in Perl zu schreiben, um die Daten in den Files im Web formatiert sichtbar zu machen.

    Hatte erwartet, daß irgendjemand diese Antwort verfassen wird, nun tu ich es eben.

    Du wirst das Problem mit ein paar einfachen Regex nicht erschlagen können. Schaue mal lieber, ob du irgendein XML-Modul nehmen kannst, die Tag-Begrenzer entsprechend generalisieren kannst (so daß eben '|' statt '>' und '<' da steht) oder eben eure DB entsprechend anzupassen, so daß sie "normales" XML erzeugt.

    use Tschoe qw(Matti);

    --
      Anyone who quotes me in their sig is an idiot. -- Rusty Russell.