Benutzer mit den meisten Antworten
Wie bekomme ich die aktuelle Zeilennummer vom StreamReader-Objekt

Frage
-
Hallo,
ich habe ein IO.StreamReader-Objekt.
Darin finde ich den Zeichenindex mit streamReader.ReadLine();Was ich brauche ist die Zeilennummer.
Hat jemand eine Idee dazu?Grüße,
Frank
Antworten
-
Hallo nochmal,
jetzt erst habe ich deine Frage richtig verstanden. Ich würde es entsprechend so machen wie von Heiko vorgeschlagen. Wirklich Zeichen für Zeichen lesen und die Zeilenumbrüche zählen.
Ich möchte noch dazu sagen, das du dabei aufpassen musst welche Art von Zeilenumbruch du genau hast. \r\n (CR LF) ist das Windows typische. \n andererseits toleriert Windows meistens auch. Das hängt meistens davon ab wie sauber der Entwickler arbeitete bzw. von welchem Betriebssystem die Datei stammt.
So oder so gilt, dass Dateien meistens konsequent ein Zeilenumbruchsformat verwenden. Darauf baut auch ReadLine auf.Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 5. Juni 2015 13:06
- Als Antwort markiert frank me Samstag, 6. Juni 2015 10:40
Alle Antworten
-
Hallo Frank,
lass in der Schleife eine Zählervariable mitlaufen, dann hast Du den Zeilenindex dort drin.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
lass in der Schleife eine Zählervariable mitlaufen, dann hast Du den Zeilenindex dort drin.
In welcher Schleife?
Ich kann eine Schleife erstellen, z.Bsp.
for(int i = 0; i <= charIndex; i++)
aber wie finde ich raus, wo eine neue Zeile beginnt?
-
Hallo Frank,
jeder Aufruf von ReadLine liest eine Zeile und bewegt den Zeiger auf den Anfang der nächsten Zeile. Daher verstehe ich deine Frage nicht.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Du rufst doch streamReader.ReadLine(); bestimmt in einer Schleife (wahrscheinlich while) auf. Du musst Dir also vor dieser Schleife, mit der die einzelnen Zeilen gelesen werden, eine Integer-Variable initialieren, z.B.
int line = 0;
Innerhalb der Schleife musst Du dann nach
streamReader.ReadLine();
Einfach nur noch die Zeile
line++;
hinzufügen. Die Variable line enthält dann die Zeilennummer.
Gruß,
Patrick
-
Ich habe einen Zeichenindex charIndex.
Und ich kann die aktuelle Zeile auslesen (die Zeile mit dem Zeichenindex charIndex):fileStream.Position = charIndex; System.IO.StreamReader streamReader = new System.IO.StreamReader(fileStream); string line = streamReader.ReadLine();
Ich habe (bis jetzt) keine Schleife darin und mit ReadLine lese ich die aktuelle Zeile (entsprechend charIndex) aus.
Was ich wissen will ist die Zeilennummer von line.
Ist es jetzt verständlicher?
-
Und um Missverständnissen vorzubeugen...
Ich suche nicht die Gesamtzahl der Zeilen,
sonder die Zahl der Zeilen bis zum charIndex.
Ich würde mich auch über ein Code-Beispiel freuen. ;)
Frank
-
Hallo Frank,
um das theoretisch erläuterte nochmal in Code zu zeigen, so in etwa sollte es aussehen:
using (var sr = new StreamReader(@"C:\Test\lines.txt")) { Console.WriteLine("{0,-5} {1}", "Zeile", "Inhalt"); int lineNumber = 0; while (!sr.EndOfStream)//Lese solange noch nicht am Dateiende angelangt { var line = sr.ReadLine();//Zeile lesen Console.WriteLine("{0,-5} {1}", lineNumber, line);//Zeile und Zeilennummer verwenden ++lineNumber;//Am Ende der Schleife um 1 erhöhen } } Console.ReadKey ();
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Aber ich will nicht die Anzahl aller Zeilen, sondern die Anzahl der Zeilen bis zum charIndex (s.o.).
-
Hallo Frank,
wenn ich dich richtig verstehe, springst du an eine bestimmte Position im Stream und liest von da an weiter, mußt aber wissen, die wievielte Zeile das ist.
Der StreamReader und der Stream liefern keine Info darüber, in welcher Zeile sich die aktuelle Position befindet.
Sofern der StremReader.BaseStream.CanSeek = true liefert, also auch das Rückwertsspringen im Stream unterstützt, könnte man an den Anfang des Streams springen (Seek(0, SeekOrigin.Begin)) und von da an solange lesen, bis die Stream.Position >= der Position ist, die du dir vor dem Zum-Anfang-Springen gemerkt hast. Dann müßte man noch hoffen, dass der StreamReader das nicht mitkriegt bzw. damit klar kommt. Falls nicht, müßte man das gesamte Lesen vielleicht anders gestalten.
Das Lesen vom Anfang bis zur aktuellen Position könnte wieder mit ReadLine() geschehen oder, wenn es direkt auf den Stream ausgeführt wird, ohne den Reader zu bemühen, mit Read() oder ReadByte(), wobei du dabei selbst die Zeilenumbruch-Zeichen zählen müßtest (und \r\n dabei berücksichtigst).
Gruß
Heiko- Bearbeitet Heiko65456465 Montag, 18. Mai 2015 16:18
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 5. Juni 2015 13:06
-
Hallo nochmal,
jetzt erst habe ich deine Frage richtig verstanden. Ich würde es entsprechend so machen wie von Heiko vorgeschlagen. Wirklich Zeichen für Zeichen lesen und die Zeilenumbrüche zählen.
Ich möchte noch dazu sagen, das du dabei aufpassen musst welche Art von Zeilenumbruch du genau hast. \r\n (CR LF) ist das Windows typische. \n andererseits toleriert Windows meistens auch. Das hängt meistens davon ab wie sauber der Entwickler arbeitete bzw. von welchem Betriebssystem die Datei stammt.
So oder so gilt, dass Dateien meistens konsequent ein Zeilenumbruchsformat verwenden. Darauf baut auch ReadLine auf.Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 5. Juni 2015 13:06
- Als Antwort markiert frank me Samstag, 6. Juni 2015 10:40