none
Wie bekomme ich die aktuelle Zeilennummer vom StreamReader-Objekt RRS feed

Antworten

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

    Montag, 18. Mai 2015 09:51
    Moderator
  • 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?


    www.energiewende-mach-ich-selbst.de

    Montag, 18. Mai 2015 11:41
  • 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

    Montag, 18. Mai 2015 11:47
    Moderator
  • 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

    Montag, 18. Mai 2015 12:30
  • 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?


    www.energiewende-mach-ich-selbst.de

    Montag, 18. Mai 2015 12:38
  • 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


    www.energiewende-mach-ich-selbst.de

    Montag, 18. Mai 2015 13:47
  • 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

    Montag, 18. Mai 2015 15:12
    Moderator
  • Aber ich will nicht die Anzahl aller Zeilen, sondern die Anzahl der Zeilen bis zum charIndex (s.o.).

    www.energiewende-mach-ich-selbst.de

    Montag, 18. Mai 2015 15:23
  • 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


    Montag, 18. Mai 2015 16:15
  • 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

    Montag, 18. Mai 2015 16:55
    Moderator