Thread In Perl mehrere Zeilen zwischen Strings einer Textdatei auslesen?
(13 answers)
Opened by Jan at 2023-02-07 04:50
Den Ansatz, die ganze Datei in ein Array einzulesen, haben ja Crian und hlubenow schon vorgeschlagen. Das Modul Tie::File würde ich aber nur bemühen, wenn die Datei zu groß ist, um bequem in den Speicher zu passen - was ich mir einer Konfigurationsdatei kaum vorstellen kann.
Das Array kannst Du dann auch benutzen, um schon während des Einlesens die "Rückwärtssuche" durchzuführen! Du bist ja dann grade an der richtigen Stelle... Hier mal als vollständiges Beispiel (mitsamt Deines Beispiel-Input, deswegen etwas länglich): Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 use 5.028; use warnings; my %found; my @lines; LINE: while (my $line = <DATA>) { push @lines,$line; $line =~ /Wort1 Wort2 (\S+)/ and do { $found{String1} = $1; next LINE; }; $line =~ /Wort3 Wort4 (\d+)/ and do { $found{Zahl1} = $1; next LINE; }; if (exists $found{String1}) { $line =~ /Wort6 Wort7 \Q$found{String1}\E/ and do { BACKWARDS: for my $backwards (reverse @lines) { if ($backwards =~ /Wort5 (.*)/) { $found{String2} = $1; last BACKWARDS; } } }; next LINE; } } say "Gefunden:"; for my $key (sort keys %found) { say " $key = $found{$key}"; } __DATA__ … … … ziemlich viele Zeilen mit uninteressantem Inhalt …. … … Wort1 Wort2 $string1 # diese Zeile wird verändert wieder ausgegeben … 0 bis 4 Zeilen mit Text … Wort3 Wort4 12345 # die Zahl1 wird noch mehrmals für ausgaben benötigt … … … ziemlich viele Zeilen und dann eine sehr ähnliche Aufgabe nur das diesmal die auszulesende Zeile VOR dem $String1 steht: … Wort5 <anderer String> # dieser string darf nicht ausgelesen werden (steht >1 Stellen von $string1 entfernt) Wort5 <String2> # String2 wird später benötigt (steht vor dem $string1) …. …einige Zeilen … Wort6 Wort7 $string1 # Zeile die den Suchstring $string1 enthält … …Weitere Zeilen… …. Das gibt dann aus: Code: (dl
)
1 Gefunden: |