Streamreader & Streamwriter (Replace String)

  • VB.NET
  • .NET (FX) 4.0

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Drahuverar.

    Streamreader & Streamwriter (Replace String)

    Hallo..
    hab gerade ein "riesiges" Problem:

    VB.NET-Quellcode

    1. Dim line As String
    2. Dim Puffer As String
    3. Dim suchText As String = "MyOldValue"
    4. Dim ersetzText As String = "MyNewValue"
    5. Try
    6. Dim sRead As StreamReader = New StreamReader("C:\bla.txt")
    7. Do
    8. line = sRead.ReadLine()
    9. Puffer += line & vbCrLf
    10. Loop Until line Is Nothing
    11. sRead.Close()
    12. Dim sw As New StreamWriter("C:\bla.txt", False)
    13. Puffer = Puffer.Replace(suchText, ersetzText)
    14. sw.WriteLine(Puffer)
    15. sw.Close()
    16. Catch x As Exception
    17. MsgBox(x)
    18. End Try


    ...alles gut und schön aber wenn die Datei nun... ja.. mehrere Zeilen lang ist (200.000~1.000.000) dauert die Bearbeitung ewig lange..
    Was kann man tun um das zu beschleunigen?

    Habe schon versucht die Datei in den Speicher zu lesen (.ReadToEnd) und anschließend zu bearbeiten. Aber irgendwie klappte das hier nicht so wirklich mit dem .Replace(n)..

    Grüße.
    Option Strict On!
    Geht nicht schneller, ganz einfach. Du kannst ja mal Testweise das ganze Async machen, dann eine Stopwatch auf der Form anzeigen (im bildlichen Sinne), weil "Ewig" jetzt nicht so konkret ist.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    @Drahuverar Ohne es getestet zu haben, probier mal dies mit 2 Dateien:

    VB.NET-Quellcode

    1. Dim suchText As String = "MyOldValue"
    2. Dim ersetzText As String = "MyNewValue"
    3. Try
    4. Using sw As New IO.StreamWriter("C:\bla2.txt", False)
    5. For Each line In IO.File.ReadLines("C:\bla.txt")
    6. sw.WriteLine(line.Replace(suchText, ersetzText))
    7. Next
    8. sw.Close()
    9. End Using
    10. Catch ex As Exception
    11. MessageBox.Show(ex.Message)
    12. End Try
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @sonne75 : Aber dadurch wird doch nur der RAM klein gehalten, Performancemäßig sollte das eig nichts ändern.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    @sonne75 : tust du dich rausreden, oder was? ;)
    Ist garnet nötig, weil dein Ansatz ist hier eindeutig vorzuziehen. Weil wies bisher ist, wird der Puffer mit jeder Iteration verlängert, und das heißt bei Datentyp String: umkopiert.
    Normal ist das Wayne, aber bei 200.000 Zeilen nicht mehr, weil da jedesmal ein String mit 20.000.000 Chars umkopiert wird (angenommen eine Zeile habe ca. 100 Chars).

    aber Rod hats ja auch schon ausprogrammiert

    ErfinderDesRades schrieb:

    tust du dich rausreden

    Wie immer, deswegen auch die Signatur :D

    ErfinderDesRades schrieb:

    weil dein Ansatz ist hier eindeutig vorzuziehen

    Danke. :) Ich und @RodFromGermany hatten gleichzeitig den gleichen Gedanken.
    Ich habe mir nur überlegt, dass Replace in einem riesen Puffer zu lange dauern könnte...

    Aber ich meinte das ernst, ich finde es interessant, Versuchsreihen aufzustellen und zu testen (meine Ideen) :)
    Ich bin generell auch der Freund von versuchen.. da lernt man am meisten.
    Aber um auf die Performance zurück zukommen: "Wieso kann ein Editor alle Wörter binnen Millisekunden/Sekunden ersetzen, die man sucht"

    Wie ErfinderDesRades ewähnt hat handelt es sich um einiges an Information pro Zeile.
    Dennoch ist z.B. mein "Notepad++" in der Lage eine *.txt mit solch einer Menge an Info kurzen Prozess zu machen, insgesamt wurde 113 mal mein Wort gesucht und ersetzt, ziemlich schnell.

    Sowas würde ich gerne auch hinbekommen, eben weil meine Daten variieren können, mal groß- mal klein.

    @RodFromGermany
    Ich schau mal fix nach, wäre auch eine Idee :)

    Grüße
    Option Strict On!

    Drahuverar schrieb:

    Ich schau mal fix nach
    Lass Dir Zeit, mach es gründlich. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @ErfinderDesRades
    Auf jeden Fall. So eine Software muss ja einiges auf dem Kasten haben, mich hat es nur gewundert.
    Muss mir mal bei Gelegenheit eine Funktion schreiben.. eine gute ;)

    @RodFromGermany
    also aus "bla" wird "bla2".
    ...ich war so faul und hab aus "bla2" wieder "bla" gemacht, so zusagen.. und "bla2" hab ich gelöscht. hihi ^^

    Vielen Dank erstmal. Super Idee!
    Danke euch Leute.
    Option Strict On!