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
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
Klingt logisch, danke.
Etwas nicht tun zu können, ist kein Grund etwas nicht zu tun.
-Alf
Man könnte es allenfalls etwas schneller machen. ReadLine() erzeugt ja einen Zeilenstring, das kostet Zeit.
Einfacher wird es dadurch aber keinesfalls.
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...
Original von Programmierhans
Ein kurzer schneller Einzeiler ...int lines=stream.ReadToEnd().Split(Environment.NewLine).Length;
int lines = sr.ReadToEnd().Split(Environment.NewLine.ToCharArray()).Length;
😉
Toll, danke!
Etwas nicht tun zu können, ist kein Grund etwas nicht zu tun.
-Alf
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...
... 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
int lines = sr.ReadToEnd().Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Length;
Hallo Noodles,
das mit RemoveEmptyEntries wird nicht funktionieren, wenn die Datei Leerzeilen enthält. Aber mit Regex.Split müsste es gehen.
herbivore
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
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
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
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