Schrift
[thread]6616[/thread]

bestimmte Zeile aus txt Datei einlesen



<< |< 1 2 >| >> 11 Einträge, 2 Seiten
mari
 2005-01-07 16:39
#50635 #50635
User since
2005-01-07
9 Artikel
BenutzerIn
[default_avatar]
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
lichtkind
 2005-01-07 16:50
#50636 #50636
User since
2004-03-22
5697 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
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.
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
renee
 2005-01-07 16:51
#50637 #50637
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
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 CPAN:Tie::File arbeiten:
Code: (dl )
1
2
3
4
5
6
7
8
9
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-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
mari
 2005-01-07 17:01
#50638 #50638
User since
2005-01-07
9 Artikel
BenutzerIn
[default_avatar]
wie kann ich die ersten 1000 Zeilen skippen?
betterworld
 2005-01-07 17:18
#50639 #50639
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
So ueberspringst Du die ersten 1000 Zeilen:
Code: (dl )
<IN> for 1..1000;

Ist nur viel ineffizienter als seek, aber wohl die einzige Moeglichkeit.\n\n

<!--EDIT|betterworld|1105111124-->
lichtkind
 2005-01-07 17:18
#50640 #50640
User since
2004-03-22
5697 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
my $linecounter;
open (IN,"<$file") or die "Can't open the file: $!\n";
seek($file, $pos, 1);
while(<IN>){
next if ($linecounter++ < 1000);
analyse();
}
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
Crian
 2005-01-07 17:24
#50641 #50641
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
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
mari
 2005-01-07 17:24
#50642 #50642
User since
2005-01-07
9 Artikel
BenutzerIn
[default_avatar]
es klappt!
vielen Dank Leute.
lichtkind
 2005-01-07 17:32
#50643 #50643
User since
2004-03-22
5697 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
du meinst $_ ja
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
renee
 2005-01-07 17:39
#50644 #50644
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
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.)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2005-01-07 16:39.