Wie jede Zeile in einer Datei zu lesen, die nur durch LF begrenzt ist?
-
16-09-2019 - |
Frage
Ich habe line-by-line lesen eine Protokolldatei. Es geht um 6 MB groß und 40000 Linie insgesamt. Aber nach meinem Programm zu testen, entdecke ich, dass die Protokolldatei nur durch LF-Zeichen begrenzt ist, nur. So kann ich nicht die Readline
Methode der StreamReader
Klasse verwenden
Wie kann ich dieses Problem beheben?
edit: Ich habe versucht, Text Reader zu verwenden, aber mein Programm immer noch nicht funktioniert:
using (TextReader sr = new StreamReader(strPath, Encoding.Unicode))
{
sr.ReadLine(); //ignore three first lines of log file
sr.ReadLine();
sr.ReadLine();
int count = 0; //number of read line
string strLine;
while (sr.Peek()!=0)
{
strLine = sr.ReadLine();
if (strLine.Trim() != "")
{
InsertData(strLine);
count++;
}
}
return count;
}
Lösung
Hat File.ReadAllLines (Dateiname) nicht richtig Dateien laden mit LF Zeile endet? Verwenden Sie diese Option, wenn Sie die gesamte Datei benötigen -. Ich sah eine Website angibt, es ist langsamer als eine andere Methode, aber es ist nicht, ob Sie die richtige Codierung, um es passieren (Standard ist UTF-8), plus es ist so sauber, wie man bekommen kann
Edit: Es tut. Und wenn Sie Streaming benötigen, TextReader.ReadLine () korrekt behandelt Unix Linie als auch endet.
Bearbeiten wieder: Das Gleiche gilt für Stream. Haben Sie gerade die Unterlagen prüfen und übernehmen wird es nicht LF Zeilenenden umgehen? Ich suche in Reflector und es scheint sicher, wie eine richtige Handhabung Routine.
Andere Tipps
TextReader.ReadLine
bereits behandelt Linien beendet gerade durch \n
.
Eine Linie wird als eine Sequenz definiert ist Zeichen gefolgt von einem Schlitten return (0x000d), ein Zeilenvorschub (0x000A), ein Wagenrücklauf, gefolgt von einer Linie Futtermittel, Environment.NewLine oder das Ende von Stream-Marker. Der String, der ist Returned enthält nicht die Abschlußwagenrücklauf und / oder Zeilenvorschub. Der Rückgabewert ist ein NULL (Nothing in Visual Basic), wenn das Ende des Eingangsstroms erreicht worden ist.
Also im Grunde, sollten Sie in Ordnung sein. (Ich habe über TextReader
gesprochen, anstatt StreamReader
, weil das ist, wo die Methode deklariert wird -. Natürlich wird es immer noch mit einem StreamReader
arbeiten)
Wenn Sie durch die Leitungen zu durchlaufen wollen einfach (und möglicherweise LINQ gegen die Log-Datei) Sie können meine LineReader
Klasse in MiscUtil nützlich. Es wickelt grundsätzlich Anrufe in einem Iterator ReadLine()
. So zum Beispiel können Sie tun:
var query = from file in Directory.GetFiles("logs")
from line in new LineReader(file)
where !line.StartsWith("DEBUG")
select line;
foreach (string line in query)
{
// ...
}
Alle Streaming:)
Ich hätte erraten \ LF (\ n) wäre in Ordnung (während \ CR (\ r) -nur könnte Probleme verursachen).
Sie können jede Zeile ein Zeichen zu einem Zeitpunkt und zu verarbeiten lesen, wenn Sie den Terminator lesen.
Nach dem Profilieren, wenn diese zu langsam ist, dann könnte man app-Side-Pufferung mit Lese ([]) verwenden. Aber versuchen Sie einfach Charakter-at-a-time zuerst!
Sie können auch die Lies-Block-Methode verwenden und analysieren die Linien selbst