Text einlesen und automatisch pro Zeile bearbeiten lassen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von FormFollowsFunction.

    Text einlesen und automatisch pro Zeile bearbeiten lassen

    Guten Tag,
    habe neu mit Visual Basic angefangen:D
    Bin gerade dabei mich an einem Programm zu vesuchen welches eine Textdatei per Button einliest den Inhalt in einer TextBox anzeigt und dann mit drücken eines zweiten Buttons bearbeitet und in einer neuen Textdatei abspeichert.
    Soweit so gut habe eine Anwendungsform erstellt mit 2 Buttons und einer RichTextBox.
    Mein Code sieht sieht wie folgt aus:


    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. 'Read Button
    4. Private Sub Readbtn_Click(sender As Object, e As EventArgs) Handles readbtn.Click
    5. Dim DatenLesen As String = File.ReadAllText("C:\Users\Tim\Desktop\VBlernen\Test.txt")
    6. RichTextBox1.Text = DatenLesen
    7. End Sub
    8. 'Write Button
    9. Private Sub Writebtn_Click(sender As Object, e As EventArgs) Handles writebtn.Click
    10. Dim DatenSpeichern As System.IO.StreamWriter
    11. DatenSpeichern = New StreamWriter("C:\Users\Tim\Desktop\VBlernen\TestBearbeitet.txt")
    12. DatenSpeichern.Write("Text vor dem Inhalt jeder Zeile:" & RichTextBox1.Text & "Text nach dem Inhalt jeder Zeile!")
    13. End Sub
    14. End Class


    Der Code für das Einlesen der Textdatei funktioniert fehlerfrei, das probelm is aber das die neue Textdatei leer ist.
    Eigentlich sollte das Programm vor jede Zeile der eingelesenen Textdatei den Satz "Text vor dem Inhalt jeder Zeile:" einfügen und nach jeder eingelesenen Zeile der Textdatei "Text nach dem Inhalt jeder Zeile!".
    Also sollte bei dem Inhalt

    Zwischentexttest1
    Zwischentexttest2
    Zwischentexttest3
    Zwischentexttest4

    ,das Programm in der neu Erstellten Textdatei den Text wie folgend gespeichert haben

    Text vor dem Inhalt jeder Zeile: Zwischentexttest1 Text nach dem Inhalt jeder Zeile!
    Text vor dem Inhalt jeder Zeile: Zwischentexttest2 Text nach dem Inhalt jeder Zeile!
    Text vor dem Inhalt jeder Zeile: Zwischentexttest3 Text nach dem Inhalt jeder Zeile!
    Text vor dem Inhalt jeder Zeile: Zwischentexttest4 Text nach dem Inhalt jeder Zeile!

    Leider ist die vom Programm gespeicherte textdatei aber leer ?(
    Würde mich sehr über hilfreiche Erleuterungen freuen,
    MFG Tim :)
    Willkommen im Forum @timbola2414.

    Da sind ein paar mehr Fehler, ohne es jetzt getestet zu haben.
    einmal würdest du nur den kompletten Inhalt eingerahmt von deinem manuellen Text erhalten, wenn Du den Stream noch closen würdest.
    siehe dazu: docs.microsoft.com/de-de/dotne…ite?view=netframework-4.8
    Noch besser wäre die Verwendung des Streamwriters in einem Using-Block, wie im Beispiel:

    VB.NET-Quellcode

    1. Using sw As StreamWriter = New StreamWriter("CDriveDirs.txt")
    2. For Each Dir As DirectoryInfo In cDirs
    3. sw.WriteLine(Dir.Name)
    4. Next
    5. End Using


    Du erwartest aber, dass jede Zeile einzeln geschrieben wird. Dazu müsstest Du den Text aber erst mal splitten, und den Split dann in einer Schleife rausschreiben.

    Vielleicht hilft Dir ja dieser Thread weiter: Zeilenweise aus Textdatei lesen und Splitten
    So, oder so ähnlich würde ich es angehen:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Private TestFilePath As String = "TextFileTest.txt"
    4. ' Liste anstatt eines Array, weil Listen viele Praktische Methoden bereithalten, z.B."AddRange".
    5. ' Das ganze Klassenweit, damit die Variable auch in der ganzen Klasse zur Verfühgung steht.
    6. Private Data As New List(Of String)
    7. Private Sub ReadData(ByVal _file As String)
    8. ' Liste leeren, falls Einträge vorhanden.
    9. If Data.Count > 0 Then Data.Clear()
    10. ' Datei einlesen.
    11. Data.AddRange(File.ReadAllLines(_file))
    12. End Sub
    13. Private Sub WriteData(ByVal _file As String)
    14. Using result As New StreamWriter(_file)
    15. ' Alle Zeilen durchlaufen ...
    16. For Each line As String In Data
    17. ' Hier werden Pre- und Postfix eingefühgt und die Zeile geschrieben.
    18. result.WriteLine($"Prefix - {line} - Postfix")
    19. Next
    20. End Using
    21. End Sub
    22. Private Sub ButtonRead_Click(sender As Object, e As EventArgs) Handles ButtonRead.Click
    23. ReadData(TestFilePath)
    24. TextBox1.Text = ""
    25. TextBox1.Text = StringArrayToString(Data.ToArray)
    26. End Sub
    27. Private Sub ButtonWrite_Click(sender As Object, e As EventArgs) Handles ButtonWrite.Click
    28. WriteData(TestFilePath)
    29. ReadData(TestFilePath)
    30. TextBox1.Text = ""
    31. TextBox1.Text = StringArrayToString(Data.ToArray)
    32. End Sub
    33. ' Konvertiert das Array in einen String mit Zeilenumbrüchen.
    34. Private Function StringArrayToString(ByVal _stringArray As String()) As String
    35. Return String.Join(Environment.NewLine, _stringArray).Trim
    36. End Function
    37. End Class


    Teile Code in Methoden auf, die möglichst nur eine Aufgabe haben, das erhöht die wiederverwendbarkeit und macht den Code auch übersichtlicher.

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