Thread Text in Datei einfügen, nicht überschreiben
(8 answers)
Opened by rommi at 2008-04-19 23:05
Wenn du schon seek nutzen willst musst du es so machen:
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 #!/usr/bin/perl use strict; use warnings; my $file='test.txt'; my $line=30; my $newdata=<<EOF; neue zeile 1 neue zeile 2 neue zeile 3 neue zeile 4 neue zeile 5 neue zeile 6 neue zeile 7 neue zeile 8 neue zeile 9 EOF { open(my $data, '+<', $file) or die "konnte $file nicht öffnen ($!)\n"; #Zeile $line finden und Zeilenposition merken <$data> for(1..$line); my $pos=tell($data); #rest in ein String packen local $/=undef; my $rest=<$data>; # zur gemerkten Position gehen und neue Datan einfügen seek($data,$pos,0); print $data $newdata.$rest; close($data); } "seek" verlangt nicht die Position in Zeilen, sondern in Byte. Das kannst du nur mit "tell" zuverlässig ermitteln. So etwas lohnt sich nur, wenn man wirklich große Dateien hat (mehrere MB). Ansonsten solltest du es machen machen wie pktm vorgeschlagen hat oder so: 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 #!/usr/bin/perl use strict; use warnings; my $file='test.txt'; my $line=30; my $newdata=<<EOF; neue zeile 1 neue zeile 2 neue zeile 3 neue zeile 4 neue zeile 5 neue zeile 6 neue zeile 7 neue zeile 8 neue zeile 9 EOF { open(my $data, '+<', $file) or die "konnte $file nicht öffnen ($!)\n"; #alles vor der Einfügeposition merken my $vor=''; ($vor.=<$data>)for(1..$line); #rest in ein String packen local $/=undef; my $rest=<$data>; # zum Anfang gehen und Daten schreiben seek($data,0,0); print $data $vor.$newdata.$rest; close($data); } p.s.: Richtig kompliziert wird es, wenn du selbst die Daten nach der Einfügestelle nicht speichern willst... :) p.p.s.: Das sähe dann so aus: 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 #!/usr/bin/perl use strict; use warnings; my $file='test.txt'; my $line=30; my $newdata=<<EOF; neue zeile 1 neue zeile 2 neue zeile 3 neue zeile 4 neue zeile 5 neue zeile 6 neue zeile 7 neue zeile 8 neue zeile 9 EOF { open(my $data, '+<', $file) or die "konnte $file nicht öffnen ($!)\n"; #Zeile $line finden und Zeilenposition merken <$data> for(1..$line); my $pos=tell($data); #rest in um die länge der Zeichen, die eingefügt werden sollen, verschieben my $length=length($newdata); seek($data,0,2); my $temppos=tell($data); print $data " "x$length; while($temppos>$pos) { $temppos--; seek($data,$temppos,0); read($data, my $z,1); seek($data,$temppos+$length,0); print $data $z; } # zur gemerkten Position gehen und neue Datan einfügen seek($data,$pos,0); print $data $newdata; close($data); } |