Sascha: Datei teilweise einlesen

Beitrag lesen

Hallo

你好 Sascha,

Mein altes Proggi bringt meinen Rechner gnadenlos in den Speicherüberlauf.

Vermutlich, weil du ein “@lines = <FILE>”-Konstrukt hast? Sinnvoller waere
da ein

while(my $line = <FILE>) {
  # mach was mit $line
}

...Das war mein erster Fehler...

Wie kann ich es nun schaffen, das nur der erste Block an Daten eingelsen
wird, korregiert und abgespeichert wird, und dann der nächste Block
erst wieder an der Stelle anfängt einzulesen an der der erste Block zu
ende war?
Kann ich einen offset einstellen (ich weiss ja z.B. das eine Zeile immer
genau 422 Zeichen besteht)?

Ich glaube, du suchst seek und tell.

再见,
CK

AHA! Genau nachdem habe ich gesucht. Habe es auch gleich ausprobiert. Klappt prima, BIS AUF DIESEN FEHLER: die erste Datei stimmt einwandfrei, bei der 2. Datei fehlt die 1. Zeile! Der Datensatz ist dann in keiner der beiden Dateien vorhanden!

Hab hier mal ein Auszug von dem wie es etwa bei mir aussieht:

sysopen (DATEI, $data2 , O_RDONLY);

while(<DATEI>)
{
  #Felder definieren, korregieren usw...
  if ($feld1 <= $dat1)               #1er Block
         {push(@NeueZeilen,$neu);}
  else                               # Block 1 zuende
         {$pos = tell (DATEI); close (DATEI);}
}

open(DAT, ">$dfs1") # Schreibe Ausgangsdatei 1
print DAT @NeueZeilen;
close (DAT);

sysopen (DATEI, $data2 , O_RDONLY);
seek (DATEI,$pos,0);                 # Position setzen
while(<DATEI>)
{
  #Felder definieren, korregieren usw...
  if ($feld1 <= $dat1) #2er Block
         {push(@NeueZeilen,$neu);}
         else {$pos = tell (DATEI); close (DATEI);}
}
open(DAT, ">$dfs2") # Schreibe Ausgangsdatei 2
print DAT @NeueZeilen;
close (DAT);

Woran liegt das ??? Ich habe auch schon von $pos-1 probiert, das war es aber nicht :-)

Danke

Sascha