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;
            }
War es hilfreich?

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.

die Dokumentation :

  

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top