Thread In Perl mehrere Zeilen zwischen Strings einer Textdatei auslesen? (13 answers)
Opened by Jan at 2023-02-07 04:50

haj
 2023-02-09 10:44
#194677 #194677
User since
2015-01-07
527 Artikel
BenutzerIn

user image
Den Ansatz, die ganze Datei in ein Array einzulesen, haben ja Crian und hlubenow schon vorgeschlagen. Das Modul CPAN: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
2
3
4
Gefunden:
String1 = $string1
String2 = <String2> # String2 wird später benötigt (steht vor dem $string1)
Zahl1 = 12345

View full thread In Perl mehrere Zeilen zwischen Strings einer Textdatei auslesen?