Thread Daten aus einer Datei lesen und in ein Verzeichnis/ Datei speichern
(11 answers)
Opened by Sanny at 2010-09-26 22:18
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; } |