Letzte Zeilennummer eines Textdokuments auslesen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von simpelSoft.

    Letzte Zeilennummer eines Textdokuments auslesen

    Hallo,
    ich würde gern wissen ob jemand eine andere Möglichkeit kennt die letzte Zeile eines Textdokument auszulesen. Ich verwende momentan eine Schleife im BackGroundWorker, dies muss sein weil ich dabei mit einer Textdatei arbeite die ca. 11GB groß ist und die Anwendung dabei sonst hängt. Das Problem ist nur dass der BGW da nicht mit spielt, da er die schleife in die RAM schiebt, aber nach einer zeit stoppt der und gibt mir eine Fehlermeldung da zu viel in der RAM liegt, gibt es nun eine Möglichkeit die letzte Zeile eines Textdokumentes auszulesen ohne Schleife?

    Dies ist mein momentaner Code:

    VB.NET-Quellcode

    1. Dim counter As Integer = 0
    2. Dim Daten_lesen() As String = IO.File.ReadAllLines(file_txt.Text)
    3. For Each pwline As String In Daten_lesen
    4. counter += 1
    5. Next
    6. MsgBox(counter)

    Isaalalmani schrieb:

    gibt es nun eine Möglichkeit die letzte Zeile eines Textdokumentes auszulesen ohne Schleife?

    Ohne Schleife ja, dann wird sich aber das RAM-Problem nicht ändern.
    Versuche doch bitte mal, die Datei per Stream zu lesen und die letzte Zeile anzeigen zu lassen - so etwa:

    VB.NET-Quellcode

    1. Dim lastLine As String = String.Empty
    2. Using reader As New StreamReader(file_txt.Text)
    3. Do Until reader.EndOfStream
    4. lastLine = reader.ReadLine
    5. Loop
    6. End Using
    7. MessageBox.Show(lastLine)


    Ich habe solche großen Dateien nicht - bin gespannt ob es geht :)
    Hab das mal getestet, mit dieser methode funktioniert es etwas schneller trotzdem noch zu langsam, ich muss ca. 40-50 sekunden warten, das ist zu lang :/

    Das mit dem Counter um die Zeilennummer auszulesen funzt auch nicht mehr, jetzt kommt die fehlermeldung: Die arithmetische Operation hat einen Überlauf verursacht.

    EDIT: Ok, also ich denke ich werde da nicht drum rum kommen eine schleife zu nutzen um die letzte zeiler auszulesen, da es ja immer bei 0 und hoch beginnen muss. Hmm muss mir also was anderes einfallen lassen ^^

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Isaalalmani“ ()

    wenn du dich mal mit bisserl fortgeschritteneren Features befassen willst, kann ich auch eine Linq-Lösung anbieten:

    VB.NET-Quellcode

    1. Messagebox.Show(System.IO.File.ReadLines(file_txt.Text).count.Tostring)


    ups - zu spät! ;)

    Schneller ist das übrigens nicht - intern ist da auch ein StreamReader zu Werke.
    Weder der erste Vorschlag von petaod hat geholfen noch der von ErfinderDesRades. Also vom tempo her sind sie gleich schnell, ihr könnt euch ja mal eine 70mb Textdatei anlegen dann wisst ihr was ich meine ^^ und ich teste das alles gerade nur mit einer 70mb Datei, die 1,9gb oder 11gb probiere ich erst garnicht.

    ErfinderDesRades schrieb:

    Schneller ist das übrigens nicht - intern ist da auch ein StreamReader zu Werke.
    Es wird zumindest von einigen Leuten behauptet.

    Microsoft schrieb:

    The ReadLines and ReadAllLines methods differ as follows:
    When you use ReadLines, you can start enumerating the collection of strings before the whole collection is returned;
    when you use ReadAllLines, you must wait for the whole array of strings be returned before you can access the array.
    Therefore, when you are working with very large files, ReadLines can be more efficient.

    Perform LINQ to Objects queries on a file to obtain a filtered set of its lines.

    Vielleicht werden die Daten gar nicht zwischengespeichert, wenn sie durch den LINQ.Filter fallen.

    Edit: Nach dem letzten Post anscheinend wohl doch nicht.

    Dann hilft wohl nur von hinten lesen:
    stackoverflow.com/a/398512
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @TE: ja, gewöhn dich dran: 1,9gb ist viel, und das komplett durchzulesen dauert.

    Ich weiß jetzt aber nicht, was du eigentlich willst - die ZeilenZahl, oder die letzte Zeile?

    Weil für die ZeilenZahl muss man halt alles durchlesen, und halt die Zeilen zählen.
    Für nur die letzte Zeile könnte man mit Stream.Seek auch vorspulen.