103 Stimmen

Wie man eine Textdatei umgekehrt mit Iterator in C# liest

Ich muss eine große Datei verarbeiten, etwa 400K Zeilen und 200 M. Aber manchmal muss ich von unten nach oben verarbeiten. Wie kann ich hier einen Iterator (yield return) verwenden? Im Grunde möchte ich nicht alles in den Speicher laden. Ich weiß, dass es effizienter ist, Iterator in .NET zu verwenden.

0 Stimmen

0 Stimmen

Eine Möglichkeit wäre, eine ausreichend große Menge vom Ende her zu lesen und dann mit String.LastIndexOf rückwärts nach " \r\n ".

0 Stimmen

Siehe meinen Kommentar im Duplikat stackoverflow.com/questions/398378/

0voto

user1913559 Punkte 107

Falls noch jemand auf dieses Problem stößt, habe ich es mit dem folgenden PowerShell-Skript gelöst, das mit geringem Aufwand in ein C#-Skript geändert werden kann.

[System.IO.FileStream]$fileStream = [System.IO.File]::Open("C:\Name_of_very_large_file.log", [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::ReadWrite)
[System.IO.BufferedStream]$bs = New-Object System.IO.BufferedStream $fileStream;
[System.IO.StreamReader]$sr = New-Object System.IO.StreamReader $bs;

$buff = New-Object char[] 20;
$seek = $bs.Seek($fileStream.Length - 10000, [System.IO.SeekOrigin]::Begin);

while(($line = $sr.ReadLine()) -ne $null)
{
     $line;
}

Damit werden die letzten 10.000 Zeichen einer Datei gelesen und jede Zeile ausgegeben.

1 Stimmen

Damit werden die letzten 10.000 Bytes vorwärts gelesen, nicht rückwärts vom Ende zum Anfang. Außerdem, warum nicht einfach .Seek(-10000, [System.IO.SeekOrigin]::End); ?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X