-
Notifications
You must be signed in to change notification settings - Fork 1
/
LineReader.pm
113 lines (90 loc) · 2.46 KB
/
LineReader.pm
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
104
105
106
107
108
109
110
111
112
113
# LineReader liesst aus den Einzeldateien jeweils eine Zeile aus.
# Via new() uebergibt man die Dateien eines Telefonbuchs. Mit
# get_line() kann man die Eintraege zeilenweise auslesen.
#
# Das Ergebnis von get_line() ist eine Hashref. Der Zugriff auf die
# einzelnen Werte erfolgt ueber einen Schlussel. Welcher Schluessel
# das dann ist, wird via new() gesteuert.
#
# Eine Besonderheit sind via new() definierte Schluessel, die den
# Unterstrich beinhalten. Der Unterstrich im Schluesselnamen gibt an,
# dass der Inhalt der Datei \t-separiert ist. Im Ergebnishash von
# get_line() findet man dann zwei Schluessel.
package LineReader;
use strict;
use IO::File;
sub new {
my $class = shift;
my $basedir = shift;
my $ref = shift;
my $self = { fh => {}};
# open files
foreach my $key (keys %$ref) {
$self->{fh}->{$key} = new IO::File;
if (not $self->{fh}->{$key}->open("$basedir/$ref->{$key}", 'r')) {
die "can't open '$ref->{$key}': $!\n";
}
}
# calculate number of lines
my $line_count_file = $basedir;
$line_count_file =~ s!\W!!g;
$line_count_file = '.' . $line_count_file;
if(not -f $line_count_file) {
print "++ running line count, storing result into '$line_count_file'\n";
my $fname = (values %$ref)[0];
$self->{line_count} = int(`wc -l $basedir/$fname`);
if($self->{line_count} == 0) {
die "can't get number of lines for '$basedir/$fname'\n";
}
open(LC, "> $line_count_file") or die "can't open line count file '$line_count_file': $!\n";
print LC $self->{line_count};
close(LC);
}
else {
print "++ reading line count file '$line_count_file'\n";
$self->{line_count} = `cat $line_count_file`;
}
print "++ $self->{line_count} lines\n";
bless $self, $class;
}
sub get_line {
my $self = shift;
my %result = ();
my $eof = 1;
foreach my $key (keys %{$self->{fh}}) {
my $fh = $self->{fh}->{$key};
if(!eof $fh) {
$eof = 0;
}
else {
warn "possible eof for $key reached\n";
}
my $tmp = <$fh>;
chomp($tmp);
my @values = split(/\t/, $tmp);
foreach my $k (split(/_/, $key)) {
$result{$k} = shift @values;
}
}
if(!$eof) {
return \%result;
}
else {
return undef;
}
}
sub skip_lines {
my $self = shift;
my $line_nr = shift;
foreach my $key (keys %{$self->{fh}}) {
my $fh = $self->{fh}->{$key};
for(my $i = 0; $i < $line_nr; $i++) {
<$fh>;
}
}
}
sub get_number_of_lines {
my $self = shift;
return $self->{line_count};
}
1;