Laden...

Zeilen zählen

Erstellt von Cpt_Future vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.896 Views
C
Cpt_Future Themenstarter:in
97 Beiträge seit 2005
vor 18 Jahren
Zeilen zählen

Hallo,

wie zähle ich denn am schnellsten die Anzahl der Zeilen in einer Datei?
Momentan mache ich es per StreamReader und der while-Schleife


while(stream.ReadLine() != null)
{
  lines++;
}

Das erscheint mir etwas umständlich, da dafür ja trotzdem die komplette Zeile ausgelesen wird.

Gruß c

Etwas nicht tun zu können, ist kein Grund etwas nicht zu tun.
-Alf

P
939 Beiträge seit 2003
vor 18 Jahren

Das wird nicht besser gehen. Die Anzahl der Textzeilen entspricht der Anzahl der NewLine-Zeichen (+1). Und um die NewLines zu zählen, muss der komplette Text gelesen und durchsucht werden.

Gruss
Pulpapex

C
Cpt_Future Themenstarter:in
97 Beiträge seit 2005
vor 18 Jahren

Klingt logisch, danke.

Etwas nicht tun zu können, ist kein Grund etwas nicht zu tun.
-Alf

S
8.746 Beiträge seit 2005
vor 18 Jahren

Man könnte es allenfalls etwas schneller machen. ReadLine() erzeugt ja einen Zeilenstring, das kostet Zeit.

Einfacher wird es dadurch aber keinesfalls.

4.221 Beiträge seit 2005
vor 18 Jahren

Ein kurzer schneller Einzeiler ...

int lines=stream.ReadToEnd().Split(Environment.NewLine).Length;

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

N
4.644 Beiträge seit 2004
vor 18 Jahren

Original von Programmierhans
Ein kurzer schneller Einzeiler ...

int lines=stream.ReadToEnd().Split(Environment.NewLine).Length;

int lines = sr.ReadToEnd().Split(Environment.NewLine.ToCharArray()).Length;

😉

C
Cpt_Future Themenstarter:in
97 Beiträge seit 2005
vor 18 Jahren

Toll, danke!

Etwas nicht tun zu können, ist kein Grund etwas nicht zu tun.
-Alf

4.221 Beiträge seit 2005
vor 18 Jahren

Original von Noodles

int lines = sr.ReadToEnd().Split(Environment.NewLine.ToCharArray()).Length;  

😉

thx @Noodles

Da war ich ein klein wenig daneben 🙂

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

C
Cpt_Future Themenstarter:in
97 Beiträge seit 2005
vor 18 Jahren

... funktioniert leider nicht, da die Zeilen offenbar doppelt gezählt werden.

\r\n also?

Wie kann ich das verhindern (halbieren + runden find ich ne schlechte Lösung).

Etwas nicht tun zu können, ist kein Grund etwas nicht zu tun.
-Alf

N
4.644 Beiträge seit 2004
vor 18 Jahren
int lines = sr.ReadToEnd().Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Length; 
49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Noodles,

das mit RemoveEmptyEntries wird nicht funktionieren, wenn die Datei Leerzeilen enthält. Aber mit Regex.Split müsste es gehen.

herbivore

C
Cpt_Future Themenstarter:in
97 Beiträge seit 2005
vor 18 Jahren

Danke Noodles, ich probiers mal aus.

Regex will ich wegen der Geschwindigkeit vermeiden.

-c

Etwas nicht tun zu können, ist kein Grund etwas nicht zu tun.
-Alf

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Cpt_Future,

Regex ist sehr schnell. Wenn es um Geschwindigkeit geht, ist eher das am-Stück-einlesen und das Spliten selbst das Problem. Die Regex kannst du im Vergleich dazu vernachlässigen. Abgesehen davon wirst du mit Noodles-Vorschlag falsche Ergebnisse bekommen.

Und schnelle inkorrekte Programme schreiben ist leicht. Das leere Programm ist eins der schnellsten (meist) inkorrekte Programme.

herbivore

C
Cpt_Future Themenstarter:in
97 Beiträge seit 2005
vor 18 Jahren

Ich hatte halt vor ein paar Tagen RegEx zum Herausfischen von einer bestimmten Info in einer XML-Datei verwendet, das hat ewig gedauert.

Eigentlich gehts um kein wichtiges Programm, soll halt primär korrekt arbeiten, sekundär ist die Geschwindigkeit.

Etwas nicht tun zu können, ist kein Grund etwas nicht zu tun.
-Alf

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Cpt_Future,

wenn man längere Regex ungüstig schreibt, kann es zu massivem Backtracking kommen. Das kann aber bei einem Split mit [EDIT]Environment.NewLine[/EDIT] nicht passieren.

herbivore