Thread Daten aus einer Datei lesen und in ein Verzeichnis/ Datei speichern (11 answers)
Opened by Sanny at 2010-09-26 22:18

topeg
 2010-10-01 11:21
#141607 #141607
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
2010-10-01T07:34:17 Sanny
topeg:"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:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
Sektion 1
datei.a
datei.b
datei.c
datei.d

Sektion 2
datei.a
datei.b
datei.c
datei.d


wurde
Code: (dl )
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
Code: (dl )
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 Sanny
topeg:"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:
Code: (dl )
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:
Code (perl): (dl )
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
#!/usr/bin/perl
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'){} # mache nichts...
    else
    { warn("Unbekannter Blocktyp: $type, Wird ignoriert!\n");}
  }
  close $fh;

  return \%ret;
}

View full thread Daten aus einer Datei lesen und in ein Verzeichnis/ Datei speichern