Thread Text in Datei einfügen, nicht überschreiben (8 answers)
Opened by rommi at 2008-04-19 23:05

topeg
 2008-04-20 14:33
#108572 #108572
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
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);
}

View full thread Text in Datei einfügen, nicht überschreiben