2012-03-29 14 views
4

Ich habe eine Textdatei in Perl zu parsen, ich parse es vom Start der Datei und erhalten Sie die Daten, die benötigt werden.Lesen Sie die letzte Zeile der Datei mit Daten in Perl

Nach allem, was getan wird, möchte ich die letzte Zeile in der Datei mit Daten lesen. Das Problem ist, dass die letzten zwei Zeilen leer sind. Wie bekomme ich die letzte Zeile, die irgendwelche Daten enthält?

+0

Die Leute, die diese Frage zu schließen gestimmt scheinen mit Perl wenig Erfahrung zu haben. Als eine Perl-Person, ich denke, der erste Satz zeigte genügend Wissen, um den minimalen Verständnis-Test zu bestehen. Kein Punkt in trivialem Code (mindestens in Perl). –

Antwort

7

Wenn die Datei relativ kurz ist, lesen Sie einfach auf, von wo aus Sie fertig die Daten bekommen, die letzte nicht leere Zeile zu halten:

use autodie ':io'; 
open(my $fh, '<', 'file_to_read.txt'); 
# get the data that is needed, then: 
my $last_non_blank_line; 
while (my $line = readline $fh) { 
    # choose one of the following two lines, depending what you meant 
    if ($line =~ /\S/) { $last_non_blank_line = $line } # line isn't all whitespace 
    # if (line !~ /^$/) { $last_non_blank_line = $line } # line has no characters before the newline 
} 

Wenn die Datei länger ist, oder Sie das letzte bestanden haben kann nicht leere Zeile in Ihren ersten Daten Schritt sammelt, wieder öffnen und vom Ende lesen:

my $backwards = File::ReadBackwards->new('file_to_read.txt'); 
my $last_non_blank_line; 
do { 
    $last_non_blank_line = $backwards->readline; 
} until ! defined $last_non_blank_line || $last_non_blank_line =~ /\S/; 
+0

hab es :), vielen Dank – fammi

4
perl -e 'while (<>) { if ($_) {$last = $_;} } print $last;' < my_file.txt 
+0

Auch eine leere Zeile enthält eine nicht leere Zeichenfolge, nämlich '\ n'. Sie wollen 'if (/ \ S /)' oder ähnliches. – TLP

+0

Und wenn Sie Zeilen mit Leerzeichen beibehalten möchten, aber Zeilen ohne Zeichen überspringen möchten, können Sie 'while (<>) {chomp; if (Länge) {... '. – Anonymous

0

Wenn die Datei klein ist, würde ich sie in einem Array speichern und vom Ende lesen. Wenn es groß ist, verwenden Sie das File :: ReadBackwards-Modul.

2

Sie das Modul File::ReadBackwards auf folgende Weise verwenden:

use File::ReadBackwards ; 
$bw = File::ReadBackwards->new('filepath') or 
    die "can't read file"; 
while(defined($log_line = $bw->readline)) { 
    print $log_line ; 
    exit 0; 
} 

Wenn sie leer sind, überprüfen Sie einfach $log_line auf eine Übereinstimmung mit \n;

0

Hier ist meine Variante von Perl-Lösung Befehlszeile:

perl -ne 'END {print $last} $last= $_ if /\S/' file.txt 
Verwandte Themen