Artikel im Internet unter http://www.hidemail.de/blog/wie-viele-zeilen-hat-die-datei-.shtml.
Mittwoch, 9.1.2008, 21:59:18 Uhr

Wie viele Zeilen hat die Datei?


So ne kleinere Spielerei nebenbei, aber auch hübsch, um zu sehen, was Perl so kann: Wie viele zeilen hat eine Datei?

Man will also wissen, wie viele Zeilen in einer Datei stehen, gesucht wird eine möglichst effektive und Speicherschonende Möglichkeit, dies herauszufinden.

Variante 1: Datei einlesen und zählen
Man liest also die Datei komplett ein und läßt die zeilen zählen, etwa so

open (my $in,'<','test.txt');
@zeilen= <$in>;
close $in;

$zeilenanzahl=@zeilen;
print "Die Datei hat $zeilen Zeilen";



Ja, das geht, aber: Wenn die Datei mehrere Megabyte oder sogar Gigabyte hat, wirds dem Rechner ein bißchen viel...
Die ganze Datei einlesen ist also schon mal blöd.

Ha, Idee, Zeilen nacheinander einlesen:


$zeilen=0;
open (my $in,'<','test.txt');
while (<$in>){$zeilen++;}
close $in;

$zeilenanzahl=@zeilen;
print "Die Datei hat $zeilen Zeilen";



Bingo, geht auch und liest nur einzelne Zeilen ein. Aber Vorsicht: Wenn eine Zeile mehrere MB oder gar GB hat, wirds dem Rechner auch wieder ein bißchen viel, denn pro Zeile wird die aktuelle Zeile $_ zugeordnet, also eingelesen!

Also schon schön, aber nicht perfekt...

Besser gehts so:


open (my $in,'<','test.txt');

$cou += tr/\n/\n/ while read ($in,$_,1024000);

close $in;
print "Die Datei hat $cou Zeilen";


Was passiert hier?
Die Datei wird geöffnet.

Danach wir per read jeweils ein Datenblock von einem Megabyte in $_ eingelesen und die darin enthaltenen \n's gezählt (tr /\n/\n/) und $cou hinzugefügt.

Wieso ist das nun besser?
Weil immer nur maximal ein MB Daten eingelesen werden. Auf Wunsch kann man den Puffer natürlich verkleinern oder vergrößern...


Man sollte es immer vermeiden, Dateien komplett einzulesen, wenn es geht. Sehr lange Dateien können, wenn sie in den Rechnerspeicher eingelesen werden, den Rechner so ziemlich lahm legen!

In diesem Sinne, bis zum nächsten Mal...



Artikel im Internet unter http://www.hidemail.de/blog/wie-viele-zeilen-hat-die-datei-.shtml.