C#, bestimmte Zeile aus Stream lesen?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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);
Woher ich das weiß:Berufserfahrung – Software-Entwickler

Isendrak  25.08.2018, 23:10

Verdammt! Du hast fast aufs Byte genau die selbe Lösung wie ich geschrieben... Und das auch noch zum gleichen Zeitpunkt... XD

1
verreisterNutzer  25.08.2018, 23:34

Weisst du vielleicht, wie ich aus einem String, einen Link auslesen kann, und den Link dann separat als String habe?

0
PWolff  26.08.2018, 23:44
@verreisterNutzer

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

1
PWolff  27.08.2018, 18:57

Nur scheint es bisher keinen Iterator über StreamReader-Zeilen zu geben.

0

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).

Woher ich das weiß:eigene Erfahrung