Thread bestimmte Positionen in text Datei auslesen (11 answers)
Opened by perle at 2013-07-12 12:39

payx
 2013-07-15 15:29
#168876 #168876
User since
2006-05-04
564 Artikel
BenutzerIn

user image
Hallo perle,

am Anfang der regex musst Du halt auch noch auf den Listfile-Eintrag prüfen. Der Backslash muss escaped werden.

Das @found-Array hat jetzt einen ersten Eintrag mehr, muss also umnummeriert werden – oder Du iterierst einfach über die Header, dann musst Du die keys nur einmal schreiben.

Das ganze Script könnte dann so aussehen:
more (27.6kb):
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my @excel_rows;

my @header = qw (LISTFILE TYPE RFORM REC-SIZE CREATION LAST-RD STATE EXEC_COPIES DATA-BEGIN DAT-END RELEASE);

# blockweises einlesen und nicht zeilenweise
# ein block endet mit "ENDJOB"
local $/ = "ENDJOB\n";

# einlesen der daten, hier aus __DATA__. Dies auf
# das Einlesen einer Datei zu übertragen bleibt dem geneigen
# Leser überlassen
while ( my $block = <DATA> ) {
    
    my @found = $block =~ m{
        ^ LISTFILE:DIRECTORY\sNAME=MAX:\\TEST\.(\d+);
        
        .*?
        
        ^ TYPE  \s+ RFORM \s+ REC-SIZE \s+   # finde die Zeile
        (\w+) \s+ (\w+) \s+ (\d+) .*?      # erste gruppe ist type
                                           # zweite gruppe ist RFORM
                                           # dritte gruppe ist REC-SIZE
        ^ CREATION \s+ LAST-RD \s+               
        (\d{4}-\d{2}-\d{2} \s+ \d{2}:\d{2}:\d{2}) \s+  # creation
        (\d{4}-\d{2}-\d{2} \s+ \d{2}:\d{2}:\d{2}) \s+  # last-rd
        
        .*?
        
        ^ STATE \s+ EXEC_COPIES \s+
        (\w+) \s+ (\d+)
        
        .*?
        
        ^ DATA-BEGIN \s+ DATA-END \s+ RELEASE \s+
        (\d{4}-\d{2}-\d{2} \s+ \d{2}:\d{2}:\d{2}) \s+  # found-begin
        (\d{4}-\d{2}-\d{2} \s+ \d{2}:\d{2}:\d{2}) \s+  # found-end
        (\d{4}-\d{2}-\d{2} \s+ \d{2}:\d{2}:\d{2}) \s+  # release
        
    }xms;
    
    my %info;
    
    for my $i (0..$#header) {
        $info{$header[$i]} = $found[$i];
    }
    
    push @excel_rows, \%info;
}

#print Dumper \@excel_rows;

open my $tsvFH, ">", "out.tsv";

#print $tsvFH $_ . "\t" for @header;
print $tsvFH join "\t", @header;
print $tsvFH "\n";

for my $row (@excel_rows) {

    #print $tsvFH $row->{$_} ? $row->{$_} . "\t" : "\t" for @header;
    print $tsvFH join "\t", map { $row->{$_} } @header;
    print $tsvFH "\n";

}

__DATA__
LISTFILE:DIRECTORY NAME=MAX:\TEST.0001;
STARTED
STARTING TIME 2013-07-05 21:24:01
USER MACHINE4/HEIMO
220: SERVICE READY FOR NEW USER. SUPI
230: USER LOGGED IN, PROCEED. SUPI
TYPE RFORM REC-SIZE
SAM FIX 8192
CREATION LAST-RD
2010-05-13 00:37:32 2013-07-05 12:56:17
STATE EXEC_COPIES
READY 2
DATA-BEGIN DATA-END RELEASE
2013-07-05 12:05:10 2013-07-05 12:23:48 2013-07-05 12:56:52
ENDJOB
LISTFILE:DIRECTORY NAME=MAX:\TEST.0001;
STARTED
STARTING TIME 2013-07-05 21:24:01
USER MACHINE4/HEIMO
220: SERVICE READY FOR NEW USER. SUPI
230: USER LOGGED IN, PROCEED. SUPI
TYPE RFORM REC-SIZE
SAM FIX 8200
CREATION LAST-RD
2010-05-12 00:37:32 2013-07-06 12:56:17
STATE EXEC_COPIES
READY 3
DATA-BEGIN DATA-END RELEASE
2013-07-06 12:06:10 2013-07-06 12:26:48 2013-07-06 12:58:52
ENDJOB


HTH
Grüße
payx

Editiert von payx: code verbessert: print mit join statt mit for
Last edited: 2013-07-16 09:02:41 +0200 (CEST)

View full thread bestimmte Positionen in text Datei auslesen