User since
2005-01-07
9
Artikel
BenutzerIn
Hallo,
mit einem Perlprogramm lese ich eine txt Datei Zeile für Zeile ein und werte sie aus.
Wie kann ich die Datei ab eine bestimmten Position (z.B. ab Zeile 1000) einlesen?
Die Datei ist ziemlich groß (80 Mb). Kann man einfach auf die gewünschte Zeile springen?
Mit dem folgenden Code scheint es nicht zu klappen!!!
open (IN,"<$file") or die "Can't open the file: $!\n";
seek($file, $pos, 1);
while(<IN>){
analyse();
}
Schon mal Vielen Dank
mari
User since
2004-03-22
5697
Artikel
ModeratorIn + EditorIn
die seek position ist in bytes aber die zeile 1000 hm
woher wollst du wissen wo sie ist wenn du nicht weisst wie lang die zeilen sind?
das fs speichern dateien nicht zeilenweise
du kannst einfach sagen perl ist schenll genug und dier ersten 1000 zeilen
skippen oder du machst einen schuss ins blaue.
User since
2003-08-04
14371
Artikel
ModeratorIn
Mit seek() geht das nicht, weil man damit zu Bytepositionen - nicht Zeilen - springt. Du hättest damit nur ne Chance, wenn Deine Zeilen immer gleich lang sind...
Du könntest mit
Tie::File arbeiten:
use Tie::File;
my $file = '/path/to/file';
my @interesting_lines;
{
tie my @array,'Tie::File', $file or die $!;
@interesting_lines = @array[999,$#array];
untie @array;
}
\n\n
<!--EDIT|renee|1105109581-->
User since
2005-01-07
9
Artikel
BenutzerIn
wie kann ich die ersten 1000 Zeilen skippen?
User since
2003-08-21
2614
Artikel
ModeratorIn
So ueberspringst Du die ersten 1000 Zeilen:
Ist nur viel ineffizienter als seek, aber wohl die einzige Moeglichkeit.\n\n
<!--EDIT|betterworld|1105111124-->
User since
2004-03-22
5697
Artikel
ModeratorIn + EditorIn
my $linecounter;
open (IN,"<$file") or die "Can't open the file: $!\n";
seek($file, $pos, 1);
while(<IN>){
next if ($linecounter++ < 1000);
analyse();
}
User since
2003-08-04
5871
Artikel
ModeratorIn
Wozu $linecounter? Dafür gibts $. .\n\n
<!--EDIT|Crian|1105111469-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;
use strict; use warnings; Link zu meiner Perlseite
User since
2005-01-07
9
Artikel
BenutzerIn
es klappt!
vielen Dank Leute.
User since
2003-08-04
14371
Artikel
ModeratorIn
nein Crian hat mit $. schon recht (siehe perldoc perlvar):
Quote $INPUT_LINE_NUMBER
$NR
$.
Current line number for the last filehandle
accessed.
Each filehandle in Perl counts the number of lines
that have been read from it. (Depending on the
value of $/, Perl's idea of what constitutes a
line may not match yours.) When a line is read
from a filehandle (via readline() or "<>"), or
when tell() or seek() is called on it, $. becomes
an alias to the line counter for that filehandle.
You can adjust the counter by assigning to $., but
this will not actually move the seek pointer.
Localizing $. will not localize the filehandle's
line count. Instead, it will localize perl's
notion of which filehandle $. is currently aliased
to.
$. is reset when the filehandle is closed, but not
when an open filehandle is reopened without an
intervening close(). For more details, see "I/O
Operators" in perlop. Because "<>" never does an
explicit close, line numbers increase across ARGV
files (but see examples in "eof" in perlfunc).
You can also use "HANDLE->input_line_number(EXPR)"
to access the line counter for a given filehandle
without having to worry about which handle you
last accessed.
(Mnemonic: many programs use "." to mean the cur-
rent line number.)