Wie kann ich zu einer bestimmten Zeile in meiner Datei springen, z.B. Zeile 300 in c:\text.txt?
Antworten
Zu viele Anzeigen?Zeilenbasierte Dateien sind nicht für den zufälligen Zugriff konzipiert. Daher müssen Sie sich durch die Datei suchen, indem Sie die erforderliche Anzahl von Zeilen lesen und verwerfen.
Moderner Ansatz:
class LineReader : IEnumerable, IDisposable {
TextReader _reader;
public LineReader(TextReader reader) {
_reader = reader;
}
public IEnumerator GetEnumerator() {
string line;
while ((line = _reader.ReadLine()) != null) {
yield return line;
}
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
public void Dispose() {
_reader.Dispose();
}
}
Verwendung:
// path is string
int skip = 300;
StreamReader sr = new StreamReader(path);
using (var lineReader = new LineReader(sr)) {
IEnumerable lines = lineReader.Skip(skip);
foreach (string line in lines) {
Console.WriteLine(line);
}
}
Einfacher Ansatz:
string path;
int count = 0;
int skip = 300;
using (StreamReader sr = new StreamReader(path)) {
while ((count < skip) && (sr.ReadLine() != null)) {
count++;
}
if(!sr.EndOfStream)
Console.WriteLine(sr.ReadLine());
}
}
Ein paar Dinge, die mir aufgefallen sind:
-
Microsofts Beispiel zur Verwendung des StreamReader-Konstruktors überprüft zuerst, ob die Datei existiert.
-
Sie sollten den Benutzer über eine Nachricht auf dem Bildschirm oder in einem Log darüber informieren, wenn die Datei entweder nicht existiert oder kürzer ist als erwartet. Auf diese Weise erfahren Sie über etwaige unerwartete Fehler, falls sie während des Debuggens anderer Teile des Systems auftreten. Mir ist bewusst, dass dies nicht Teil Ihrer ursprünglichen Frage war, aber es ist eine gute Praxis.
Also handelt es sich um eine Kombination mehrerer anderer Antworten.
string path = @"C:\test.txt";
int count = 0;
if(File.Exists(path))
{
using (var reader = new StreamReader(@"c:\test.txt"))
{
while (count < 300 && reader.ReadLine() != null)
{
count++;
}
if(count != 300)
{
Console.WriteLine("In dieser Datei gibt es weniger als 300 Zeilen.");
}
else
{
// mit der Verarbeitung fortfahren
}
}
}
else
{
Console.WriteLine("Die Datei '" + path + "' existiert nicht.");
}
///
/// Ruft die angegebene Zeile aus einer Textdatei ab.
///
/// Die Nummer der zurückzugebenden Zeile.
/// Identifiziert die zu lesende Textdatei.
/// Die angegebene Zeile, falls vorhanden, oder ein leerer String sonst.
/// Die Zeilennummer ist negativ oder der Pfad fehlt.
/// Die Datei konnte nicht gelesen werden.
public static string GetNthLineFromTextFile(int lineNumber, string path)
{
if (lineNumber < 0)
throw new ArgumentException(string.Format("Ungültige Zeilennummer \"{0}\". Muss größer als null sein.", lineNumber));
if (string.IsNullOrEmpty(path))
throw new ArgumentException("Es wurde kein Pfad angegeben.");
using (System.IO.StreamReader reader = new System.IO.StreamReader(path))
{
for (int currentLineNumber = 0; currentLineNumber < lineNumber; currentLineNumber++)
{
if (reader.EndOfStream)
return string.Empty;
reader.ReadLine();
}
return reader.ReadLine();
}
}