C#, bestimmte Zeile aus Stream lesen?
Guten Tag,
Wie kann ich aus einem Stream der z.B. 500 Zeilen hat, die 246. Zeile auslesen?
Muss ich den Stream in einen String umwandeln?
3 Antworten
Letztlich musst du den Stream als String oder eine Serie von Strings auslesen, da Zeilenumbrüche nur als Strings überhaupt definiert sind.
Wenn du nur vorwärts lesen willst/musst, brauchst du den Stream nicht in ein String oder eine Liste von Strings umzuwandeln.
Z. B.
string zeile246; // muss hier deklariert werden, da sie sonst nicht aus dem using-Block rauskommt
using (StreamReader streamReader = new StreamReader(stream))
{
for (int i = 0; i < 246 - 1; i++) { // die ersten 245 Zeilen überspringen
streamReader.ReadLine();
}
zeile246 = streamReader.ReadLine();
}
Sollte es einen Enumerator für die Zeilen eines TextReaders geben, kannst du auch aus Linq die Skip-Methode nehmen:
using System.Linq;
...
streamReader.Lines.Skip(246 - 1);
zeile246 = streamReader.ReadLine();
oder die ElementAt-Methode:
zeile246 = streamReader.ElementAt(245);
Weisst du vielleicht, wie ich aus einem String, einen Link auslesen kann, und den Link dann separat als String habe?
Ich würde dafür eine Regex (einen Regulären Ausdruck) verwenden - das geht am schnellsten, wenn man Reguläre Ausdrücke kennt.
Sonst das String Zeichen für Zeichen durchgehen.
Stell am besten eine eigene Frage dafür.
using System.Text.RegularExpressions;
...
var match = Regex.Match(stringMitLinkDrin, @"\b(\w+\://\w+\.\w+[A-Za-z0-9_.~!*'();:@&=+$,/?#\[\]%-]+)\b");
if (match.Success) {
url = match.Groups[1].Value;
}
oder ähnlich
Da einem Stream das Konzept von Zeilen unbekannt ist, müsstest du etwas anders an die Sache herangehen. Am einfachsten geht das mit nem System.IO.StreamReader bzw. System.IO.TextReader:
string line246;
using(TextReader reader = new StreamReader(mystream)){
//Die ersten 245 Zeilen auslesen und ignorieren.
for(int i = 0; i < 246; ++i){
reader.ReadLine();
}
line246 = reader.ReadLine();
}
Oder du ließt "einfach" den Stream Byte für Byte und führst die Zeilenumbrucherkennung "manuell" durch (Achtung: Es gibt mindestens 3 verschiedene Arten von Zeilenumbrüchen \r, \n und \r\n).
Das lässt sich durch einen Blick in die C# Referenz herausfinden.
Ansonsten hilft Google immer wieder gerne:
https://stackoverflow.com/questions/1262965/how-do-i-read-a-specified-line-in-a-text-file
Verdammt! Du hast fast aufs Byte genau die selbe Lösung wie ich geschrieben... Und das auch noch zum gleichen Zeitpunkt... XD