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 12:49
#141586 #141586
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Das Script von Linuxer auf das geänderte Dateiformat angepasst.
Das Parsen ist getestet, aber das Kopieren nicht.

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#!/usr/bin/perl
use strict;                          # strict verwenden
use warnings;                        # ebenso Warnungen einschalten
use File::Spec;                      # Modul zum Zusammensetzen von Dateipfaden
use File::Copy;                      # Modul zum Kopieren/Verschieben von Dateien
use File::Path;                      # Modul zum rekursiven Erstellen von Verzeichnissen
                                     # Hilfe/Details zu den Modulen: ($modulename entsprechend ersetzen)
                                     #    http://search.cpan.org/perldoc?$modulname

my $file='sector_file.txt';
# globaler Hash mit Pfadinformationen
my %path = (
        sectioninfo => '/tmp/section_info.x',    # kompletter Pfad zur Datei "Sektionsinfo.x"
        dst_dir     => '/tmp/sections',          # Verzeichnispfad, wohin die Dateien kopiert werden
        src_dir     => '/tmp/source_sections',   # Verzeichnispfad, von wo die Dateien kopiert werden
        section     => 'Sek_1',                  # Angabe der Sektion die kopiert werden soll,
                                                 # wenn er Eintrag leer undef oder nicht vorhanden ist,
                                                 # so werden alle gefundenen Sektionen Kopiert
);

# lese Die Sektioninfos ein
my $sections = parse_file( $path{sectioninfo}, $path{section} );

# jede Sektion einzeln betrachten
for my $section_name ( keys{%$sections} )
{
  # Prüfen ob die Sektion kopiert werden soll
  next if($path{section} && $section_name ne $path{section});

  # Zielpfad ermitteln
  my $destination = File::Spec->catdir( $path{dst_dir}, $section_name );

  # lege Verzeichnis $destination an, wenn noch nicht vorhanden
  if ( ! -e $destination ) {
    mkpath $destination or die "mkdir $destination failed: $!\n";
  }
  # sterbe mit Fehler, wenn $destination existiert und kein Verzeichnis ist
  elsif ( !-d $destination ) {
    die "$destination is not a directory: $!\n";
  }

  # Dateien Kopieren
  copy_files_from_to( $sections->{$section_name}, $path{src_dir}, $destination );
}

########################################################################

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 $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='';
    }
    # ein Sektor wurde gefunden
    # nun hole alle Dateinamen.
    # Sie stehen immer hinter einer leeren Zeile
    elsif($sector_now && $line!~/^\s*$/ && $last_line=~/^\s*$/)
    {
      my $fname=$line;
      chomp($fname);
      push(@{$ret->{$sector_now}},$fname);
    }

    # letzte zeile speichern,
    # um später zu testen, ob sie leer ist
    $last_line=$line;
  }
  close($fh);

  return $ret;
}

_END_

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