2010-10-01T07:34:17
Sannytopeg:"Ein Sektor besteht aus einer Reihe von Blöcken dessen 'Titel' den Dateinamen repräsentieren. der Inhalt folgt bis zu einer leeren Zeile oder einer reihe von '.....' Beliebiger Anzahl."
-> AW:Ein Sektor besteht aus einer Reihe von Blöcken dessen 'Titel' den Dateinamen repräsentieren. der Inhalt folgt bis zu einer leeren Zeile.
also aus:
Sektion 1
datei.a
datei.b
datei.c
datei.d
Sektion 2
datei.a
datei.b
datei.c
datei.d
wurde
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
Sek_Data
Number of Sections: n
Sek_1
datei1.dat
Etwas Text
.........
datei2.dat
Etwas Text
.........
datei3.dat
Etwas Text
datei4.tmp
............
datei5.tmp
.............
Sek_2
datei1.dat
.......
datei2.dat
.......
datei3.dat
......
datei4.tmp
............
datei5.tmp
.............
wurde
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
Sek_1
datei1.dat
Etwas Text
datei2.dat
Etwas Text
datei3.dat
Etwas Text
datei4.tmp
Etwas Text
datei5.tmp
Etwas Text
Sek_2
datei1.dat
Etwas Text
datei2.dat
Etwas Text
datei3.dat
Etwas Text
datei4.tmp
Etwas Text
Ich hoffe dir fällt dein Fehler auf.
2010-10-01T07:34:17
Sannytopeg:"Wer zum .... hat sich ein solches Dateiformat ausgedacht?! Keine eindeutigen Trenner! Wer macht so was?? Wie soll man zuverlässig das Ende der Datei erkennen?"
AW: Was für ein Dateiformat/ Strukturierung kannst du empfehlen, wenn man die Daten unterschiedlicher Dateien in eine zusammenfassen will, um mit diesen möglichst gut (weiter-)arbeiten zu können?
Dir ist klar das Leute gut dafür bezahlt werden sich Dateiformate aus zu denken.
Aber was hindert dich Zip oder Tar oder ein anderes Archivformat zu nutzen? Um es klarer zu formulieren welche Rahmenbedingungen hast du?
Wer soll die Daten wie erzeugen?
Wie sehen die Kriterien der Weiterverarbeitung aus?
Ohne fundierte Informationen kann ich dich schlecht beraten. Sollte ich das vorhandene Format "verbessern", so würde ich davon ausgehen, dass Menschen die Dateien von Hand oder Halbautomatisch zusammenfügen. Die Dateien selber nur Text und keine Binärdaten enthalten und das Ergebnis noch von Menschen lesbar sein soll. Weiterhin soll der Parser einfach sein und ohne Module auskommen.
Mein Vorschlag wäre dann:
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
SECFILE V2
trenner----------------------------------------------------------trenner
COMMENT
Wie man sehen kann beginnt die Datei mit einem "magischen" Wort.
Damit erkennt der Parser das er die datei parsen kann.
Die Zweite Zeile ist der Trenner, der Blöcke, die in der Datei verwendet werden soll.
Er sollte eindeutig sein, damit er nicht zufällig als Dateiinhalt auftaucht.
Es sind bisher drei Blocktypen definiert, die durch den Trenner getrennt werden:
SECTION: Definiert den beginn einer Sektion gefolgt vom Namen
FILE: Definiert eine datei gefolgt vom Dateinamen und den Inhalt
COMMENT: Kommentare, werden beim Parsen ignoriert.
Weitere Typen können definiert werden,
Unbekannte Typen werden (mit einer Warnung) ignoriert,
sodaß auch spätere Formatgeneratonen wenigstens teilweile
mit einem älteren Parser gelesen werden können
trenner----------------------------------------------------------trenner
SECTION
Sektion 1
trenner----------------------------------------------------------trenner
FILE
test1.txt
bla bla bla
trenner----------------------------------------------------------trenner
FILE
test2.txt
bla bla bla
trenner----------------------------------------------------------trenner
FILE
test3.txt
bla bla bla
trenner----------------------------------------------------------trenner
SECTION
Sektion 2
trenner----------------------------------------------------------trenner
FILE
test1.txt
bla bla bla
trenner----------------------------------------------------------trenner
FILE
test2.txt
bla bla bla
trenner----------------------------------------------------------trenner
FILE
test3.txt
bla bla bla
trenner----------------------------------------------------------trenner
Mit einem Parser der Art:
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
use strict;
use warnings;
use Data::Dumper;
print Dumper(parse('file.sec'));
sub parse
{
my $file=shift;
return undef unless($file);
my $sec=shift;
my $fname=shift;
my %ret;
open(my $fh, '<', $file) or die("error open $file $!\n");
if(<$fh> ne "SECFILE V2\n")
{
warn("Ungültiges Dateiformat!\n");
return undef;
}
my $trenner=<$fh>;
local $/="\n$trenner";
my $section=$sec?undef:'DEFAULT';
while(my $block=<$fh>)
{
chomp($block);
$block=~s/^\s+//s;
my ($type,$name,$data)=split(/\n/,$block,3);
next unless(defined($type));
$name=~s/^\s+//;
if($type eq 'SECTION')
{
if(defined($sec))
{
if($name eq $sec)
{ $section=$name }
else
{ $section=undef; }
}
else
{ $section=$name; }
}
elsif($type eq 'FILE')
{
next unless(defined($section));
$data='' unless(defined($data));
if(defined($fname))
{ $ret{$section}{$name}=$data if($fname eq $name); }
else
{ $ret{$section}{$name}=$data };
}
elsif($type eq 'COMMENT'){}
else
{ warn("Unbekannter Blocktyp: $type, Wird ignoriert!\n");}
}
close $fh;
return \%ret;
}