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-09-30 20:49
#141598 #141598
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Nur um es klar zu stellen:
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.

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? der reguläre Inhalt einer Datei kann doch '....' oder eine leere Zeile enthalten, genauso kann eine Datei eine Zeile enthalten die wie ein Dateiname Aussieht. Man müsste schon die Formate aller DateiInhalte kennen um das zuverlässig zu Parsen, und selbst dann kann man sich nicht sicher sein. Ich weiß nicht mal ob die '....'-Zeile und die leere Zeile zum Inhalt gehören oder nicht. Oder ob die leeren Eilen nach einer '....'-Zeile zum DateiInhalt gehören. Das ist ein Rateformat.
Ich habe mal etwas zusammengebaut was eventuell funktioniert... Ich gehe davon aus dass Leere Zeilen und '....' Zeilen nicht mehr zum DateiInhalt gehören.

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
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/usr/bin/perl
use strict;                          # strict verwenden
use warnings;                        # ebenso Warnungen einschalten

# lese Die Sektioninfos ein
my $sections = parse_file( 'section_info.x' );

for my $section_name (sort keys(%$sections))
{
  print "$section_name\n";
  for my $file_name (sort keys(%{$sections->{$section_name}}))
  {
    print "   $file_name\n";
    my $data=$sections->{$section_name}->{$file_name};
    $data=~s/(^|\n)/$1      /g;
    print "$data\n";
  }
  print "#"x70,"\n\n"
}
########################################################################

sub parse_file
{
  my $file=shift;
  # wenn kein Sektorname angeben gib alle Sektoren zurück.
  my $sector=shift;
  # wenn $sector nur eine Zahl ist, den Vollständigen Namen ergänzen
  $sector="Sek_$sector" if(defined($sector) && $sector=~/^\d+$/);

  open(my $fh, '<', $file) or die("Error open $file ($!)\n");
  my $ret={};
  my $sector_now;
  my $fname=undef;
  my $last_line='';
  while(my $line=<$fh>)
  {
    chomp($line);

    # Sektordefinitionen beginnen immer mit einem "Sek_" gefolgt von einer Zahl
    if($line=~/(Sek_\d+)/)
    {
      # Ausnahmeregelung wenn nur ein Sektor gesucht ist
      if($sector)
      {
        if($1 eq $sector)
        { $sector_now=$1 }
        # abbrechen wenn der Sektor vollständig gelesen wurde
        elsif($sector_now && $sector_now eq $sector)
        { last }
      }
      else
      { $sector_now=$1; }
      # $line leeren,
      # sonst wird später die erste Datei nicht gefunden.
      $line='';
      $fname=undef;
    }
    # ein Sektor wurde gefunden
    # nun hole alle Dateinamen.
    # Sie stehen immer hinter einer leeren Zeile oder einer Zeile mit '....'
    elsif($sector_now && $line!~/^(?:\s*|\.{3,})$/ && $last_line=~/^(?:\s*|\.{3,})$/)
    {
      $fname=$line;
      $ret->{$sector_now}->{$fname}='';
    }
    # alles bis zur nächsten leeren Zeile oder '....' Zeile ist der Dateinhalt
    elsif($sector_now && $fname && $line!~/^(?:\s*|\.{3,})$/)
    { $ret->{$sector_now}->{$fname}.="$line\n"; }

    # letzte Zeile speichern,
    # um später zu testen, ob sie leer ist, oder '....' enthält
    $last_line=$line;
  }
  close($fh);

  return $ret;
}

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