Frage

Ich analysiere eine sehr große Datei mit Datensätzen (jeweils pro Zeile, jeweils unterschiedliche Länge), und ich möchte die Anzahl der Bytes im Auge behalten, die ich in der Datei gelesen habe, damit ich mich im Falle eines wiederherstellen kann Versagen.

Ich habe Folgendes geschrieben:

using (TextReader myTextReader = CreateTextReader())
{
    string record = myTextReader.ReadLine();
    bytesRead += record.Length;
    ParseRecord(record);
}

Dies funktioniert jedoch seitdem nicht ReadLine() Streifen Sie alle CR/LF -Zeichen in der Zeile. Darüber hinaus kann eine Linie entweder durch Cr-, LF- oder CRLF -Zeichen beendet werden, was bedeutet bytesRead.

Gibt es eine einfache Möglichkeit, die tatsächliche Linienlänge zu erhalten, oder schreibe ich meine eigene? ReadLine() Methode in Bezug auf die Granular Read() Operationen?

War es hilfreich?

Lösung

Die aktuelle Position des zugrunde liegenden Streams hilft nicht, da der StreamReader die Daten aus dem Stream puffert.

Im Wesentlichen können Sie dies nicht tun, ohne Ihren eigenen StreamReader zu schreiben. Aber müssen Sie wirklich?

Ich würde einfach die Anzahl der gelesenen Zeilen zählen.

Dies bedeutet natürlich, dass Sie sich zu einer bestimmten Zeile positionieren müssen, um N -Zeilen zu lesen, anstatt einfach nur zu einem Offset zu suchen, aber was ist daran falsch? Haben Sie festgestellt, dass die Leistung inakzeptabel ist?

Andere Tipps

Ein TexTreader liest Strings, die Charaktere sind, die [je nach Codierung] nicht gleich Bytes sind.

Wie wäre es, wenn Sie nur die Anzahl der gelesenen Zeilen speichern und so viele Zeilen überspringen, wenn sie sich wiederherstellen? Ich denke, es geht nur darum, diese Linie nicht zu verarbeiten, und nicht unbedingt zu vermeiden, sie aus dem Stream zu lesen.

Kommen Sie, um darüber nachzudenken, ich kann a verwenden StreamReader und holen Sie sich die aktuelle Position des zugrunde liegenden Stroms wie folgt.

using (StreamReader myTextReader = CreateStreamReader())
{
    stringRecord = myTextReader.ReadLine();
    bytesRead += myTextReader.BaseStream.Position;
    ParseRecord(record);
    // ...
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top