Halihallo Christian
Ich habe Philipps Beispiel mal in PHP übersetzt (um gleiche Testbedingungen zu machen) und die Werte für eine Textdatei mit 12000 Zeilen und einem Knappen MB getestet.
Hm, und was ist mit last-100-Zeilen von einem Text mit 130 Zeilen? - Ist doch auch ein
realistischer Use-Case? - Wird aber wohl auch etwas schneller sein, schätze ich.
Dabei hat Philipps Beispiel durchschnittlich so abgeschnitten:
real 3m16.526s
Mein Beispiel dagegen erledigte die Aufgabe in durchschnittlich:
real 0m32.489s
Ohhh, schande über mich :-)
---
Etwas verspätet, aber dennoch kommend: die Perl-Version (danke für die PHP Version!)
---
#!/usr/bin/perl
use strict;
my $lines = 10; # how many lines do ya want?
my $chunk_size = 100; # each line has an avarage of 100 bytes.
open( F, '<./input.txt' ) || die "cannot open input: $!";
binmode(F) || die "cannot binmode the handle: $!";
my $buf = ''; # define them here instead of in the while is much better!
my $tbuf= '';
my $offset = -1*($chunk_size+1); # last character in file is -1, so first
# chunk begins at -(chunk+1)
my $lines_read = 0; # how many lines have we already found?
while ( $lines_read <= $lines ) { # as long as we haven't read enough...
seek(F,$offset,2); # seek next chunk
unless (read(F,$tbuf,$chunk_size)) {
last; # perhaps error (beginning of file passed),
# or eof which is not very common here :-)
}
$lines_read += ($tbuf =~ tr/\n//); # unfortunately \015\012|\015|\012 is not
# possible here :-(, but everything else
# costs more...
$buf = $tbuf.$buf;
$offset-=$chunk_size; # we select chunk before if we need more lines.
}
close(F) || die "cannot close input: $!";
my @last_lines = (split(/\n/,$buf))[(-1*$lines)..-1];
print join("\n", @last_lines);
---
Könnte man zwar auch noch etwas feilen, aber dazu habe ich im Moment weder Lust noch
Zeit; aber für Gedanken, Fehler, Verbesserungsvorschlägen und anderem habe ich "immer"
Lust und Zeit.
Viele Grüsse
Philipp
RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.