Thread Datei einlesen
(38 answers)
Opened by Fredl at 2012-03-09 15:50
Hier ein Beispiel wie man es machen kann. Ich setze den LineInputSeparator neu um mir Die Blöcke zu holen, die alle wichtigen Informationen haben. Dann schreibe ich jeden Block gewünschte male. Bei jeden Block suche ich die Zahlen, die ersetzt werden sollen und schreibe den den richtigen Wert dort hin, welchen ich aus der gelesenen Zahl und und dem aktuellen Zähler errechne.
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 #!/usr/bin/perl use strict; use warnings; my $file_in='test.data.txt'; my $file_out='test.data.out.txt'; my $separator="\n# TIME STEP "; my $count=24; my @blocks; # lokalen Gültigkeitsbereich erzeugen { open(my $fh_in, '<', $file_in) or die("Error open $file_in ($!)\n"); # setze Zeilentrenner neu local $/=$separator; # nun wird nur noch an "\n#TIME STEP " getrennt, # blöcke einlesen @blocks=<$fh_in>; # zeilentrenner "\n# TIME STEP " entfernen, # da sie am ende das Blockes stehen # und nicht am anfang chomp(@blocks); close($fh_in); } { open(my $fh_out, '>', $file_out) or die("Error open $file_out ($!)\n"); # den Kopf des Dokumentes übernnehmen print $fh_out shift(@blocks); # Jeden Block durch gehen for my $block_in (@blocks) { # 24 durchläufe for my $nr (1..$count) { # kopie erstellen my $block_out=$block_in; # die Nummer von "# TIME STEP <Nummer>" finden und ersetzen # duch das trennen der Blöcke steht die nummer nun ganz am Anfang. # Mit "sprintf" die Ausgabe formatieren # aus 1 wird 01 aus 2 => 02 aus 11 => 11 usw. # die Option "e" führt den Ersetzungsteil als perl aus. $block_out=~s/^\s*(\d+)/sprintf('%02u',($1-1)*$count+$nr)/e; # das 'ts<Nummer>' suchen und ersetzen $block_out=~s/'ts(\d+)'/sprintf("'ts%02u'",($1-1)*$count+$nr)/e; # "# TIME STEP <Nummer>" # und den veränderten Inhalt in die neue Datei schreiben. print $fh_out $separator.$block_out } } close($fh_out); } Getestet hier mit: Code: (dl
)
1 # Schedule name |