Hallo FIFO,
wenn du wieder ein bisschen Zeit findes mein neues Perl Skript zu korrigieren, werde ich sehr dankbar.
Die Idee das Skript ist eine Datei zu lesen, und die Namen und die Nummer von den Records zu finden. Danach brauche ich eine separarte Datei mit den Namen und der Häufigkeit.
Eine Zeile sieht so aus:
961020,,ddo0n0,07.12.200 19:12.208
Name:ddo0n0 oder auch v:t oder ähnliche
Nummer:961000
Danach soll ich die Namen von Datei1 mit einer Liste mit allen richtigen Namen vergleichen und diese Namen und dazugehörige Nummer in einem neuen Error- Datei schreiben, die NICHT in der Liste sind, aber in Datei1 auftauchen. Diese Namen sind falsch.
Meine Code:
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#!/usr/local/bin/perl -w
use strict;
use warnings;
my $dumpfile = "Data1.txt"; # write the name of the input file
my $boltons = "Data2.txt";
my $resdir = "errors"; # directory where will be saved the files with the unused packs
my %dump_packs;
my @pack;
my $bolt;
my %exist;
my @tmp;
my $i=0;
if (! -d $resdir) {
mkdir($resdir) or die("Could not create result directory $resdir\n");
}
open (my $in, '<', $dumpfile) or die "Could not open $dumpfile: $!\n";
while (<$in>) {
my @tmp=split(/,/, $_, -1);
my $line= $tmp[0];# the number related to the name
push @{$dump_packs{$tmp[2]}}, $line ; # hash: key: name, value: number
}
close $in;
for my $key (sort keys %dump_packs) { # write the name and occurency in a new file
@pack=$key;
open(my $out, '>', "$resdir/ ${dumpfile}_dump.txt") or die $!;
print $out join('', $key); # key and occurency ???
close $out;
}
open (my $in2, '<', $boltons) or die "Could not open $dumpfile: $!\n";
while (<$in2>) { # find the missing dump_packs keys comparing dump_packs keys with the records into Data2.txt
chomp($_);
my $bolt = $_ ;
for ($i = 0; $i <= $#pack; $i++)
{
if($bolt =~ /$pack[$i]/)
{ $exist{$pack[$i]} += 1;} # exist
else
{ $exist{$pack[$i]} += 0;} # not exist
}
for my $key (sort keys %exist){ # write the unexisting names from the Data1.txt with the related numbers in a new error file: packs not in the list
if ($exist{$key}==0){
my $index=$key;
for my $key (sort keys %dump_packs){
if ($key=~ /$index/){
open(my $out, '>', "$resdir/ ${dumpfile}_packs_notlist.txt") or die $!; {
print $out join(',', @{$dump_packs{$key}});
close $out;
}
}
}
}
}
}
close $in2;
Probleme:
1.Ich bekomme immer die Nachricht: Use of uninitialized value $tmp[2] in hash element at packs_comp_3.pl line 30, <$in> line 28.
Use of uninitialized value $tmp[2] in hash element at packs_comp_3.pl line 30, <$in> line 29.
Mit diesen zwei Nachrichten funktioniert es manchmal, wenn die andere unkorrekte Sachen auskommentiere, aber kriege ich zwei Werte, die keine Name haben, wie freie Zeile oder sowas. Ich verstehe das nicht.
2.Beim Erzeugen von dem ersten Datei mit der Namen und Häufigkeit, schreibt nut einen einzigen Wert und nicht alle in dem Hash.
3. Die extraktion von den falschen Namen funktioniert nicht richtig:(
4. Habe ich wieder zu langsam das Skript gemacht???
Herzlichen Dank im Voraus.
Schöne Grüße,
Emeto
Last edited: 2011-07-05 10:04:48 +0200 (CEST)