Zeilen aus Textdatei löschen

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von Gottric.

    Zeilen aus Textdatei löschen

    Hallo, ich möchte gerne eine Textdatei auslesen Zeile für Zeile. Wenn Die Zeile mit einer bestimmten Zahl aus einer Textbox beginnt will ich diese löschen. Also komplett löschen. Das der Restliche Text aufrückt. Also es ist wichtig dass die Reihenfolge eingehalten wird und keine Leerzeilen dazwischen sind.

    Ich dachte mir das so. ich lese alle Zeilen in eine Listobx, lösche dann die Zeile raus und speichere sie wieder ab.

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Dim index = 0
    3. Dim linesIndex = File.ReadAllLines(Pfadprg21prg + "prg__dir.dat")
    4. For Each zeile As String In linesIndex
    5. index += 1
    6. If zeile.TrimStart.StartsWith(txtPrgNr.Text) Then
    7. MessageBox.Show(index.ToString)
    8. Dim Position = Integer.Parse(index.ToString)
    9. Dim Lines As New List(Of String)
    10. Lines.AddRange(IO.File.ReadAllLines(Pfadprg21prg + "prg__dir.dat"))
    11. For Each line In Lines
    12. If line.TrimStart.StartsWith(txtPrgNr.Text) Then
    13. Lines.Remove(Lines.Item(Position))
    14. Dim Output As String = String.Join(vbNewLine, Lines.ToArray)
    15. IO.File.WriteAllText(Pfadprg21prg + "test21.txt", Output)
    16. End If
    17. Next
    18. End If
    19. Next
    20. End Sub


    Könnt ihr mir helfen?

    Edit: Es ist noch wichtig dass bei der Datei immer 1 Leerzeichen vor jeder Zeile steht.
    Beispiel:
    " 1Grün"
    " 10 Grün"
    " 100 Grün"
    " 1000 Grün"
    In Datei 1 sind maximal Zhalen bis 9999 möglich.
    und bei einer andren Datei auf der ich es Anwenden möchte ist es wichtig dass ich wenn eine 1 Am Anfang steht 4 Leerzeichen dann Leerzeichen und Text stehen. bei einer 10 3 Leerzeichen etc.
    Beispiel:
    " 1 Grün"
    " 10 Gelb"
    " 100 Organge"
    " 1000 Blau"
    "99999 Rot"
    Dort sind maximal Zahlen bis 99999 möglich.

    Hoffe das ist so verständlich.

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

    Gottric schrieb:

    VB.NET-Quellcode

    1. Dim Position = Integer.Parse(index.ToString)
    What :?:

    VB.NET-Quellcode

    1. If line.TrimStart.StartsWith(txtPrgNr.Text) Then
    Wenn in der TextBox "10" drin steht, sollen da die Zeilen
    " 10 Grün"
    " 100 Grün"
    " 1000 Grün"
    oder nur die Zeile
    " 10 Grün"
    gelöscht werden?
    Wenn nur " 10 Grün" machst Du
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Dim index = 0
    3. Dim Lines As New List(Of String)
    4. Lines.AddRange(IO.File.ReadAllLines(Pfadprg21prg + "prg__dir.dat"))
    5. For i = Lines.Count - 1 To 0 Step -1
    6. Dim zeile = Lines(i).Split({" "c}, StringSplitOptions.RemoveEmptyEntries)(0)
    7. If zeile = txtPrgNr.Text Then
    8. MessageBox.Show(index.ToString)
    9. Lines.RemoveAt(i)
    10. End If
    11. Next
    12. IO.File.WriteAllLines(Pfadprg21prg + "test21.txt", Lines.ToArray())
    13. End Sub

    ansonsten
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Dim index = 0
    3. Dim Lines As New List(Of String)
    4. Lines.AddRange(IO.File.ReadAllLines(Pfadprg21prg + "prg__dir.dat"))
    5. For i = Lines.Count - 1 To 0 Step -1
    6. If Lines(i).TrimStart.StartsWith(txtPrgNr.Text) Then
    7. MessageBox.Show(index.ToString)
    8. Lines.RemoveAt(i)
    9. End If
    10. Next
    11. IO.File.WriteAllLines(Pfadprg21prg + "test21.txt", Lines.ToArray())
    12. End Sub

    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!
    Letzten Endes musst du abhängig vom Datentyp prüfen:

    If Not Line = "" Then ...
    If Not X = Nothing Then ...
    If Not i = 0 Then ...
    If i <> 0 Then ...
    If File.Exists() Then ...
    Usw.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @mrMo

    Gottric schrieb:

    ob die Zeile überhaupt existiert.
    Da nur existierende Zeilen abgearbeitet werden, musst
    Du Dein Auswahlktiterium sehr scharf formulieren, um die und nur die nicht geforderten Zeilen zu eliminieren.
    Das musst Du so lange an Deinen Zeilen testen und tunen, bis es Deinen Erwartungen entspricht.
    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!
    Deine Prüfung muss vor der Verarbeitung des entsprechenden Datensatzes statt finden. Abbrechen kannst du mit dann mit:
    Return
    Exit Sub
    Exit Function
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ich kann es nicht glauben, ich bekomm es nicht hin. hab alle möglichen varianten durchgespielt.
    wie greife ich ab dass wenn die Zeile nicht existiert er mir ne meldung bringt?
    und noch ne verständnisfrage, warum braucht man -1 to 0step -1?

    VB.NET-Quellcode

    1. For i = Lines.Count - 1 To 0 Step -1


    was setzte ich denn falsch?

    VB.NET-Quellcode

    1. Dim index = 0
    2. Dim Lines As New List(Of String)
    3. Lines.AddRange(IO.File.ReadAllLines(Pfadprg21prg + "test21.txt"))
    4. For i = Lines.Count - 1 To 0 Step -1
    5. If i <> 0 Then
    6. MsgBox("Programm " + (txtPrgNr.Text) + " existiert nicht in der Dir-Datei!", MsgBoxStyle.Critical, "Fehler")
    7. Return
    8. End If
    9. If Lines(i).TrimStart.StartsWith(txtPrgNr.Text) Then
    10. Lines.RemoveAt(i)
    11. End If
    12. Next
    13. IO.File.WriteAllLines(Pfadprg21prg + "test21.txt", Lines.ToArray())
    14. MsgBox("Programm " + (txtPrgNr.Text) + " ist aus der Dir-Datei gelöscht!", MsgBoxStyle.Critical, "Fehler")

    Äh Moment mal. Meine obigen Beispiele waren nicht zwingen auf den Projekt bezogen :)

    Du musst dir überlegen ob der Fall X in deinem Programmablauf überhaupt eintreten kann.

    Das hier ist ja wohl nicht sinnvoll:
    If i <> 0 Then
    MsgBox("Programm " + (txtPrgNr.Text) + " existiert nicht in der Dir-Datei!", MsgBoxStyle.Critical, "Fehler")
    Return

    Lines ist ja eine List(Of String). Hier kann man, falls sinnvoll, Prüfen
    If (Lines(i) = "") Then ... z.B. Next/Return/Exit/etc.
    Oder umgekehrt
    If (Not Lines(i) = "") Then DoAwsomeStuff()
    Oder auch
    If (Lines(i) <> "") Then DoAwsomeStuff()

    warum braucht man -1 to 0step -1

    Rod geht hier Rückwärts durch die Liste. Man hätte hier auch "For i = 0 To Lines.Count -1" oder eine For Each Schleife nutzen können.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ok, das mit dem Rückwärtsgehen verstehe ich.

    VB.NET-Quellcode

    1. Dim index = 0
    2. Dim Lines As New List(Of String)
    3. Lines.AddRange(IO.File.ReadAllLines(Pfadprg21prg + "test21.txt"))
    4. For i = Lines.Count - 1 To 0 Step -1
    5. If (Lines(i) <> "") Then
    6. MsgBox("Programm " + (txtPrgNr.Text) + " existiert nicht in der Dir-Datei!", MsgBoxStyle.Critical, "Fehler")
    7. Return
    8. End If
    9. If Lines(i).TrimStart.StartsWith(txtPrgNr.Text) Then
    10. Lines.RemoveAt(i)
    11. End If
    12. Next
    13. IO.File.WriteAllLines(Pfadprg21prg + "test21.txt", Lines.ToArray())
    14. MsgBox("Programm " + (txtPrgNr.Text) + " ist aus der Dir-Datei gelöscht!", MsgBoxStyle.Critical, "Fehler")


    aber warum mein code nicht funktioniert wie ich das will verstehe ich nicht. was setzte ich denn falsch an der Meldung?
    Was genau macht denn dieses Konstrukt hier?
    -> If (Lines(i) <> "") Then ...
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Schau genau:

    Gottric schrieb:

    VB.NET-Quellcode

    1. If (Lines(i) <> "") Then
    2. MsgBox("Programm " + (txtPrgNr.Text) + " existiert nicht in der Dir-Datei!", MsgBoxStyle.Critical, "Fehler")
    3. Return
    4. End If
    insbesondere schau auf #5 und auf #7, und mach dir klar, wann das passiert, und was da passiert, wenn es passiert.
    Was genau willst du den mit diese Prüfung verhindern? Macht es Sinn, die Methode zu verlassen, wenn der String nicht leer ist?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    VB.NET-Quellcode

    1. If (Lines(i) <> "") Then
    2. MsgBox("Programm " + (txtPrgNr.Text) + " existiert nicht in der Dir-Datei!", MsgBoxStyle.Critical, "Fehler")
    3. Return
    4. End If

    Gottric schrieb:

    na ich lese den Code so:
    wenn Lines(i) undgleich 0 ist kommt eine massegebox und das Prg. steigt aus an der stelle.

    ist das falsch?
    Jo.
    Zunächstmal kann Lines(i) niemals 0 sein, aufgrund verschiedener Datentypen. Aber in #5 steht ja auch nix von 0, sondern da wird mit "" verglichen. Was da steht ist: Sobald du auf irgendeine nicht-leere Zeile triffst: messagebox und aussteigen.
    Oder kurz: Die Schleife, nein, die ganze Methode wird schon beim ersten Schleifen durchlauf verlassen - klar, dass das nix findet.

    Gottric schrieb:

    warum braucht man -1 to 0step -1?
    Wenn Du eine Collection von vorne her abarbeitest und Elemente löschst, wird die Collection neu organisiert. Z.B. wird beim Löschen des Items 3 das bisherige Item 4 zu Item 3.
    Da Item 3 aber gerade abgearbeitet wurde, wird das ehemalige Item 4, nun Item 3, nicht noch mal angefasst.
    Wird die Collection von hinten aufgerollt, ändert sich beim Umbau an den noch abzuarbeitenden Items nix.
    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!
    Hallo, ich hab da noch ein Problem mit dme löschen von Textzeilen in Textdateien.

    Ich lese mir eine Liste rein. wenn diese die Nummer entält lösche ich sie raus und speichere die Liste wieder ab.
    Dann möchte ich die Liste erneut laden und etwas an eine bestimmte postion schreiben.
    Wenn ich vorher die Liste nicht überarbeitet habe funktioniert es. ich hab exrta schon das Programm einfrieren lassen weil ich dachte das speichern der Überarbeiteten list überschneidet sich mit dem lade der selbigen zum spätern zeitpunkt.
    Aber wirkungslos. Wo muss ich denn die List üebrarbeiten sodass ich sie in wieder einladen kann?
    Überarbeiten tue ich sie von Zeile 15-24
    und wieder einladen und nochmals überarbeiten will ich in Zeile 25

    VB.NET-Quellcode

    1. Dim exitWhile22prg As Boolean = False
    2. Dim exitWhile22dbk As Boolean = False
    3. Dim txtPrgNr_Int22 As Integer = CInt(txtPrgNr.Text)
    4. Dim String1_22, String2_22 As String
    5. Dim dir22dbk As String
    6. Dim dir22prg As String
    7. Dim selectedItem22 As Object
    8. selectedItem22 = ComboBox1.SelectedItem
    9. If selectedItem22.ToString() = "Roboter 2.2" Then
    10. dir22prg = System.IO.File.ReadAllText(Pfadprg22prg + "prg__dir.dat")
    11. If dir22prg.Contains(txtPrgNr.Text) Then
    12. MsgBox("Nummer ist schon vergeben an Roboter 2.2!", MsgBoxStyle.Information, "Info")
    13. Return
    14. Else
    15. Dim index = 0
    16. Dim Lines As New List(Of String)
    17. Lines.AddRange(IO.File.ReadAllLines(Pfadprg22dbk + "dbk__dir.dat"))
    18. For i = Lines.Count - 1 To 0 Step -1
    19. If Lines(i).TrimStart.StartsWith(txtPrgNr.Text) Then
    20. Lines.RemoveAt(i)
    21. End If
    22. Next
    23. IO.File.WriteAllLines(Pfadprg22dbk + "dbk__dir.dat", Lines.ToArray())
    24. System.Threading.Thread.Sleep(100)
    25. dir22dbk = System.IO.File.ReadAllText(Pfadprg22dbk + "dbk__dir.dat")
    26. Select Case MessageBox.Show("Programmnummer " + txtPrgNr.Text + " ist verfügbar an Roboter 2.2" & vbCrLf & vbCrLf & "Programm und Datenbank erstellen?", "Abfrage", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)
    27. Case Windows.Forms.DialogResult.Yes
    28. While exitWhile22prg = False
    29. txtPrgNr_Int22 -= 1
    30. If dir22prg.Contains(txtPrgNr_Int22.ToString) Then
    31. String1_22 = dir22prg.Substring(0, dir22prg.IndexOf(txtPrgNr_Int22.ToString))
    32. String2_22 = dir22prg.Substring(dir22prg.IndexOf(txtPrgNr_Int22.ToString))
    33. String2_22 = String2_22.Insert(String2_22.IndexOf(vbNewLine), vbNewLine & " " + txtPrgNr.Text & " " + txtDir.Text)
    34. dir22prg = String1_22 & String2_22
    35. exitWhile22prg = True
    36. End If
    37. End While
    38. IO.File.WriteAllText(Pfadprg22prg + "prg__dir.dat", dir22prg)
    39. IO.File.WriteAllLines(Pfadprg22prg + "prg_" + (txtPrgNr.Text) + ".dat", txtPrginhalt.Lines)
    40. While exitWhile22dbk = False
    41. txtPrgNr_Int22 -= 1
    42. If dir22dbk.Contains(txtPrgNr_Int22.ToString) Then
    43. String1_22 = dir22dbk.Substring(0, dir22dbk.IndexOf(txtPrgNr_Int22.ToString))
    44. String2_22 = dir22dbk.Substring(dir22dbk.IndexOf(txtPrgNr_Int22.ToString))
    45. String2_22 = String2_22.Insert(String2_22.IndexOf(vbNewLine), vbNewLine & " " + txtPrgNr.Text & " " + txtDir.Text)
    46. dir22dbk = String1_22 & String2_22
    47. exitWhile22dbk = True
    48. End If
    49. End While
    50. IO.File.WriteAllText(Pfadprg22dbk + "dbk__dir.dat", dir22dbk)
    51. IO.File.WriteAllLines(Pfadprg22dbk + "dbk_" + (txtPrgNr.Text) + ".dat", txtDbkinhalt.Lines)
    52. System.Threading.Thread.Sleep(500)
    53. MsgBox("Programm " + (txtPrgNr.Text) + " mit dazugehöriger Datenbank an Roboter 2.2 erstellt!", MsgBoxStyle.Information, "Info")
    54. Case Windows.Forms.DialogResult.No
    55. End Select
    56. End If
    57. End If


    Wenn ich den Code ohne Zeile 15-24 ausführe klappt alles super. Das Problem liegt daran dass er mir dann die Zahl aus txt.Prg.Nr an die chronologisch flasche stelle setzt.
    Zum Beispiel:
    " 7199 grün"
    " 7200 Blau"
    " 7201 orange"
    " 7203 gelb"
    müsste er schreiben wenn ich die 7201 als txt.Prg.Nr eingebe.

    Er schreibt aber, nur wenn ich den Text vorher bearbeitet habe.
    " 7199 grün"
    " 7201 orange"
    " 7200 Blau"
    " 7203 gelb"

    Die Zeile ist ordnugnsgemäß gelöscht aus der Datei, habe dort einen Haltepunkt eingesetzt und dann die eigentliche Datei kontrolliert. das passt. er löscht die 7201 aus der Datei raus und speicher es ab. Also muss meine Anwendung die Datei ja davor schon eingelesen haben. So denke ich mir das.

    Vielleicht seht ihr ja wo ich was falsch gesetzt habe.

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

    Gottric schrieb:

    Vielleicht seht ihr ja wo ich was falsch gesetzt habe.
    Eher nicht.
    Deine Benennungen sind unklar, der Text ist schlecht lesbar.
    Setze einen Haltepunkt rein, steppe den Code unter beiden Bedingungen durch und finde den Unterschied in der Behandlung beider Fälle.
    Wenn Du das nicht schaffst, solltest Du alle Daten liefern, die erforderlich sind, den Effekt zu reproduzieren, denn testen kann man nur mit Testdaten, die wir nicht haben..
    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!
    Ok danke, ich versuch es dann weiter.

    Edit:

    Habe den Fehler gefunden.
    Ab Zeile 41 nenne ich

    VB.NET-Quellcode

    1. txtPrgNr_Int22 -= 1
    dann

    VB.NET-Quellcode

    1. txtPrgNr_Int22dbk -= 1

    und deklariere es im kopf natürlich auch neu. dann geht es. aber warum weiß ich nicht.

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