Thread Dateistruktur überprüfen (2 answers)
Opened by Gast at 2007-02-01 01:50

bloonix
 2007-02-01 09:55
#73907 #73907
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo oes,

zunächst einmal ein paar Verbesserungsvorschläge zu deinem Code:

Statt des globalen Filehandles DATEI_S empfehle ich eine private Variable.
Ausserdem erwartet open() mehr als nur zwei Argumente.

open my $fh, '<', $dateiname_s or die ...

Statt auf den Angleoperator in der Schleife zurückzugreifen, empfehle ich
dir eine andere private Variable zu nutzen. Der Angleoperator kann sehr
schnell überschrieben werden.

while (my $line = <$fh>) { ... }

In deinem ersten Codestück wird für jede fehlerhafte Zeile der Dateiname
nach @s_fail gepushed. Das möchtest du bestimmt nicht! Bei 100 fehler-
haften Zeilen hast du in @s_fail 100 Mal den Dateinamen stehen.

Wenn ich es richtig verstanden habe, dann ist dein wichtigstes Kriterium,
dass jede Zeile 78 Zeichen lang ist und mit einer vierstelligen Ziffer
beginnt. Alle anderen Zeilen sind fehlerhaft.

Code: (dl )
1
2
3
4
5
6
7
8
while (my $line = <$fh>) {
  if (length($line) == 78 && $line =~ /^[0-9]{4}/) {
     # diese Zeile ist einwandfrei
  } else
     push @s_fail, $line
        unless ord(substr($_,0,1) == 26;
  }
}

Falls du nur auf fehlerhafte Zeichen in mehreren Dateien prüfen möchtest,
dann wäre es wünschenswert, alle fehlerhaften Zeilen zur späteren
Kontrolle festzuhalten. Sehr informativ wären hierbei wohl der Dateiname,
die Zeilennummer und natürlich die Zeile selbst. Diese Informationen
möchte man bestimmt auch nicht in einem Array behalten, denn je nach
Anzahl der Dateien und Zeilen die geprüft werden und fehlerhaft sind,
könnte das wohl deinen Speicher stark beanspruchen.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
open my $out, '>', $file_out or die $!;

for my $dateiname_s (@files) {
  my $counter = 0;

  open my $in, '<', $dateiname_s or do {
     warn "Kann $dateiname_s nicht oeffnen: $!";
     next; # ab zur naechsten Datei
  }

  while (my $line = <$in>){
     ++$counter;
     chomp($line);
     next unless length($line) == 78 && $line =~ /^[0-9]{4}/;
     print $out "$dateiname_s $counter $line\n"
        unless ord(substr($line,0,1) == 26;
  }

  close $in;
}

close $out;


Gruss,
opi\n\n

<!--EDIT|opi|1170317858-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.

View full thread Dateistruktur überprüfen