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

Gast Gast
 2007-02-01 01:50
#73906 #73906
Ich komme mit folgendem Problem nicht weiter:

Ich möchte die Struktur einer Datei überprüfen. Gewöhnlich sind alle Zeilen nach einem chomp 78 Zeichen lang und beginnen mit einer 4-stelligen Ziffer. Wenn alle Zeilen so sind ist die Integrität in Ordnung. Manchmal ist aber die letzte Zeile eine leere Zeile, oder die letzte Zeile enthält bloss das "Substitude" Zeichen STRG+Z,welches mir in Notepad++ als "SUB" angezeigt wird.

Angefangen habe ich so:

Code: (dl )
1
2
3
4
5
6
7
8
9
open DATEI_S, $dateiname_s
or die "Kann $dateiname_s nicht oeffnen: $!";
while(<DATEI_S>){
chomp ($_);
if ($_=~/^[0-9]{4}/){
if ((length($_)!=78)) {
push (@s_fail, $dateiname_s);
}
}


Dies führte Dazu, dass zwar die Länge der Zeile überprüft wurde aber lediglich nur der Zeilen, die auch mit einer 4-stelligen Ziffer beginnen. So gingen mir kaputte Zeilen, die eben nicht mit einer 4-stelligen Ziffer beginnen, aber durchaus 78 Zeichen lang sein können durch die Lappen.

Ich habe versucht nach zu bessern, bekomme aber nicht alle Kriterien unter einen Hut:

1.) Zeilen müssen immer 78 Zeichen lang sein
2.) Zeilen müssen mit 4-stelliger Zahl beginnen
3.) Leerzeile am Ende der Datei muss ignoriert werden
4.) Das Sub Zeichen (ord() gibt als Zahl die 26 aus) am Ende der Datei muss ignoriert werden.

Dieser Lösungsversuch klappt nicht:

In der if Anweisung soll der Marker $check nur dann gesetzt werden, wenn die Zeile ungleich 78 lang ist, keine leere Zeile ist und das erste Zeichen nicht das Steuerzeichen 26 ist (STRG+Z).
Habe ich die if Anweisung nicht korrekt geschrieben?

Code: (dl )
1
2
3
4
5
6
7
8
 while(<DATEI_S>){
$check=0;
chomp ($_);
$first_char=ord(substr($_,0,1));
if ((length($_)!=78) && (!($_=~/^\s*$/)) && ($first_char!=26) ) {
$check=1;
}
}


Ich erwarte keinen fertigen Code, aber vielleicht kann mir Jemand mitteilen, wie ich das Steuerzeichen 26 ignorieren kann.Vielen Dank im Voraus.

View full thread Dateistruktur überprüfen