An bestimmter Stelle in Textdatei schreiben

  • VB.NET

Es gibt 64 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    hmm, ok. Danke dir @RodFromGermany
    ich versuch mal auf dem schlagwort auszubauen wenn es damit funktionieren könnte.

    @Eierlein das Problem liegt darin dass ich vorher üebrprüfen muss ob die Zeile in der Datei vorhanden ist. wenn ich das mit Starswith mache zeigt er die anderen ja auch. Ohh moment. ich kann ihm ja die Leerzeichen voranstellen. Prüfe ich sofort.

    VB.NET-Quellcode

    1. dir21dbk.StartsWith(" " + txtDbkNr.Text + " ") Then

    also so filtert er mir nicht raus dass es die 73 schon gibt in der Datei.

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

    @Gottric Poste mal mehrere mögliche Zeilen (konstruiert aber real), in denen "42" vorkommt.
    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!
    Falls dies der Aufbau einer Zeile erlaubt:
    - Datei zeilenweise durchgehen
    - Zeilen beim Leerzeichen splitten (ggf. führendes Leerzeichen trimmen)
    - Der Erste Teil dürfte dann deine Zahl sein, der andere dein String.
    - ggf. mit TryParse prüfen ob es wirklich eine Zahl ist
    - Das ganze dann in ein Dictionary(Of Integer, String) packen. Danach kannst du anhand der Eingabe in der Textbox schauen ob es diese im Dictionary gibt. Falls ja, hast du deinen Treffer und den entsprechenden String zur Zahl.

    Würde das nicht reichen?
    "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 such die Datei mal raus.
    aber vorab, kann es sein dass es daran liegt weil ich mit ReadallText einlese?

    @mrMo
    hast du das so in der Richtung gedacht?

    VB.NET-Quellcode

    1. Dim Lines As New List(Of String)
    2. Lines.AddRange(IO.File.ReadAllLines(Pfadprg21prg + "prg__dir.dat"))
    3. For i = Lines.Count - 1 To 0 Step -1
    4. Dim zeile = Lines(i).Split({" "c}, StringSplitOptions.RemoveEmptyEntries)(0)
    5. If zeile.StartsWith(txtDbkNr.Text) Then
    6. MsgBox("belegt")
    7. End If
    8. Next


    Datei sieht genau so aus:
    " 1 Gelb"
    " 7 Grün"
    " 12 Orange"
    " 73 Apfel"
    " 420 Blau"
    " 735 Auto"
    " 4587 Rot"
    " 7395 Laptop"
    etc.

    und mein Problem ist nicht das einsetzen später an der Richtigen stelle, das funktioniert soweit mit dem Code den ich habe.
    Aber ich muss prüfen ob wenn ich in meine textbox 73 eingebe ob die am Anfang einer Zeile steht. wenn ich die Datei öffen und die 73 entferne. Sagt er trotzdem bei .contains dass die Zhal vorkommt, was sie ja auch tut. in 735 und 7395 zum Beispiel. Bei 4 stelligen zahlen geht das natürlich mit .contains weil die ja maximal 1x vorkommen kann.


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

    @Gottric Ja, sowas in der Richtung:
    Spoiler anzeigen


    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim lstDateiInhalt As New List(Of String)
    3. Dim dcZeilen As New Dictionary(Of Integer, String)
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. lstDateiInhalt.Add(" 1 Gelb")
    6. lstDateiInhalt.Add(" 7 Grün")
    7. lstDateiInhalt.Add(" 12 Orange")
    8. lstDateiInhalt.Add(" 73 Apfel")
    9. lstDateiInhalt.Add(" 420 Blau")
    10. lstDateiInhalt.Add(" 735 Auto")
    11. lstDateiInhalt.Add(" 4587 Rot")
    12. lstDateiInhalt.Add(" 7395 Laptop")
    13. For Each sTeile As String In lstDateiInhalt
    14. Dim sGesplitteteZeile() As String = sTeile.Trim.Split(CType(" ", Char))
    15. Dim iZeileNummer As Integer
    16. Integer.TryParse(sGesplitteteZeile(0), iZeileNummer)
    17. dcZeilen.Add(iZeileNummer, sGesplitteteZeile(1))
    18. Next
    19. End Sub
    20. Private Sub cmd_suchen_Click(sender As Object, e As EventArgs) Handles cmd_suchen.Click
    21. Dim iSuchKey As Integer = Convert.ToInt16(nud_suche.Value)
    22. If (dcZeilen.ContainsKey(iSuchKey)) Then
    23. MessageBox.Show("Gefundener Eintrag: " & dcZeilen(iSuchKey))
    24. Else
    25. MessageBox.Show("Nix gefunden")
    26. End If
    27. End Sub
    28. End Class


    "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

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

    mrMo schrieb:

    VB.NET-Quellcode

    1. Dim sGesplitteteZeile() As String = sTeile.Trim.Split(CType(" ", Char))
    machst Du

    VB.NET-Quellcode

    1. Dim sGesplitteteZeile() As String = sTeile.Trim.Split(" "c))
    ==========================

    Gottric schrieb:

    kann es sein dass es daran liegt weil ich mit ReadallText einlese?
    Nein.
    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!
    @RodFromGermany

    Mal abgesehen von der kürzeren Schreibweise, gibt es einen speziellen Vorteil von Split(" "c) gegenüber CType(" ", Char)?
    "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 schrieb:

    " "c
    ist vom Typ Char, das muss nicht konvertriert werden, äquivalent zu ' ' in C / C++ / C#.
    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!

    RodFromGermany schrieb:

    ist vom Typ Char, das muss nicht konvertriert werden, äquivalent zu ' ' in C / C++ / C#.


    ​Ah ok. Ja in C# verwende ich auch immer ​' '.
    In VB.NET eier ich jedes mal rum und konvertiere dann am Ende einfach weil ich die ​ " "c Variante nicht kannte :D
    ​Danke für die Erlösung, hat mich schon lange genervt :thumbsup:
    "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
    Danke euch, ich hab jetzt nachtschicht. wenn ich dazu komme mache ich dann sofort bisschen weiter.
    ich hab eben auch mal etwas mit regex rumgespielt.

    VB.NET-Quellcode

    1. For Each Line As String In IO.File.ReadAllLines(Pfadprg21prg + "prg__dir.dat", System.Text.Encoding.Default)
    2. Line = Line.TrimStart
    3. If txtDbkNr.Text = Regex.Matches(Line, "[0-9]{0,}")(0).ToString Then
    4. MsgBox("belegt")
    5. End If
    6. Next


    Aber irgendwas läuft da falsch.

    Gottric schrieb:

    Aber irgendwas läuft da falsch.


    Schau dir mal mein Beispiel an. Denke Regex ist hier nicht zwingend nötig.
    "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
    Hier ein consolen Testprogramm:

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. 'TestArray erstellen
    4. Dim Zeile(7) As String
    5. Zeile(0) = " 1 Gelb"
    6. Zeile(1) = " 7 Grün"
    7. Zeile(2) = " 12 Orange"
    8. Zeile(3) = " 73 Apfel"
    9. Zeile(4) = " 420 Blau"
    10. Zeile(5) = " 735 Auto"
    11. Zeile(6) = " 4587 Rot"
    12. Zeile(7) = " 7395 Laptop"
    13. 'oder aus der Datei lesen
    14. 'Dim Zeile() As String = System.IO.File.ReadAllLines(Pfadprg21prg + "prg__dir.dat", System.Text.Encoding.Default)
    15. Dim txt As String = "73"
    16. For i As Integer = 0 To Zeile.Length - 1
    17. If Zeile(i).StartsWith(" " & txt.Trim & " ") Then
    18. MsgBox(txt & " gefunden in Zeile: " & i.ToString)
    19. End If
    20. Next
    21. ' Jetzt Zeile 3 ändern/löschen
    22. Zeile(3) = ""
    23. 'jetzt nochmal suchen
    24. For i As Integer = 0 To Zeile.Length - 1
    25. If Zeile(i).StartsWith(" " & txt.Trim & " ") Then
    26. MsgBox(txt & "gefunden in Zeile: " & i.ToString)
    27. Else
    28. MsgBox(txt & " nicht gefunden in Zeile: " & i.ToString)
    29. End If
    30. Next
    31. End Sub
    32. End Module

    Gottric schrieb:

    aber vorab, kann es sein dass es daran liegt weil ich mit ReadallText einlese?
    Ja, hatten wir doch schon.
    ReadAllText ergibt einen Text, also einen String. Einen!. Du willst aber aus deinen Zeilen eine aussuchen, also brauchst du viele Strings - jeder sei eine Zeile. Hast du nur einen String, kannst du logischerweise daraus keinen aussuchen. Also verwende ReadAllLines, dann erhälst du viele Strings, für jede Zeile einen, und daraus kannst du eine Zeile aussuchen.


    Gottric schrieb:

    Datei sieht genau so aus:
    " 1 Gelb"
    " 7 Grün"
    " 12 Orange"
    " 73 Apfel"
    " 420 Blau"
    " 735 Auto"
    " 4587 Rot"
    " 7395 Laptop"

    ich muss prüfen ob wenn ich in meine textbox 73 eingebe ob die am Anfang einer Zeile steht.
    Beim Coden ist Kenntnis der Sprache nur die halbe Miete.
    Die andere Hälfte ist das exakte Formulieren der Probleme. Das ist oft überraschend einfach.
    In deim Fall suchst du die Zeile, die mit " 73 " beginnt. Beachte, dass ich " 73 " sage, das ist ein String, und nicht 73 - das wäre eine Zahl. Und beachte, dass der String " 73 " auch Spaces enthält (was eine Zahl ja schon vom Datentyp her nicht kann).
    Nun formuliere ich dein Prob:
    Du suchst den Index der Zeile, die mit " 73 " beginnt.
    Und nun in vb:

    VB.NET-Quellcode

    1. ' {lines As List(Of String)}
    2. Dim i73 = lines.FindIndex(Function(line)line.StartsWith(" 73 "))
    So einfach ist das, und ist die genaue Umsetzung des zuvor menschen-sprachlich formulierten Problems.
    Moin zusammen, ich konnte gestern auf der Arbeit leider nicht s machen am Programm. aber habe mich heute morgen sofort drangesetzt.
    @Eierlein den Code aus Post 32 von dir habe ich getestet heute morgen. ich versuche mal die anderen funktionenen dort noch einzubinden wie reinschreiben wenn nicht vorhanden und all so sachen. also meinen Code den ich am Anfang gepostet habe dann auch das System mit der Zeilenweisen durchsucherei umzustellen.
    ich melde mich sofrt wenn ich es habe, bzw wenn ich nochmal eure hilfte bräuchte.

    Es ist soweit :)

    Ich glaube ich bin zu doof den Code von dir @mrMo einzubinden.
    nochmal zum Hintergrund. Ich möchte die DAtei einlesen, Zeile für Zeile, dann üebrprüfen ob am Zeilenanfang eine Zahl die ich in einer Textbox eintrage steht. wenn nicht möchte ich diese dort eintragen an der richtigen position. also an der immer nächst kleineren angekliedert. das ist wichtig, sonst geht die Maschine auf störung wo ich die Daten aufspiele. Von daher denke ich, weil sich ja die anforderungen geändert haben bracuhe ich nen neuen code. nicht mehr den mit den Strings zusammenfügen den ich vorher mit hilfe des Forums erarbeitet habe. DA dieser nur einwandfrei mit 4 stelligen Zahlen funktioniert. Von daher bin ich mit ner Liste besser dran, dneke ich mal. Ist ja so von @RodFromGermany auch schon erwähnt wordne als ich das Tehma geöffnet habe vor paar monaten. Könnte ihr mir helfen, ich versuche alles möglich aber es will nciht klappen. Ich suche mir Codes raus, ich lese bei MDSN ich suche hier im Forum und versuche alles zusammenzubasteln aebr es will nciht klappen.

    Ich kann die Datei Zeilenweise einlesen und auch das mit dem Splitten funktioniert wie ihr mir das gezeigt habt, glaube ich mal.
    aber dann überprüfen ob sie drin ist und wenn nich an die richtige stelle schreiben geht nicht.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. 'For Each Nummer In txtDbkNr.Text
    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).Trim.Split(" "c)(0)
    7. ' If zeile = txtDbkNr.Text Then
    8. ' MsgBox("Nummer vorhanden")
    9. ' End If
    10. ' Next
    11. 'Next
    12. Dim iSuchKey As Integer = Convert.ToInt16(txtDbkNr.Text)
    13. If (dcZeilen.ContainsKey(iSuchKey)) Then
    14. MessageBox.Show("Gefundener Eintrag: " & dcZeilen(iSuchKey))
    15. Else
    16. MessageBox.Show("Nix gefunden")
    17. End If
    18. End Sub
    19. 'Dim Lines As New List(Of String)
    20. ' Lines.AddRange(IO.File.ReadAllLines(Pfadprg21prg + "prg__dir.dat"))
    21. ' For i = Lines.Count - 1 To 0 Step -1
    22. 'Dim zeile = Lines(i).Split({" "c}, StringSplitOptions.RemoveEmptyEntries)(0)
    23. 'If zeile = item.ToString().Replace("dbk", "").Replace("_", "").Replace("prg", "") Then
    24. ' Lines.RemoveAt(i)
    25. ' End If
    26. 'Next
    27. Dim lstDateiInhalt As New List(Of String)
    28. Dim dcZeilen As New Dictionary(Of Integer, String)
    29. lstDateiInhalt.AddRange(IO.File.ReadAllLines(Pfadprg21prg + "prg__dir.dat"))
    30. For Each sTeile As String In lstDateiInhalt
    31. Dim sGesplitteteZeile() As String = sTeile.Trim.Split(" "c)
    32. Dim iZeileNummer As Integer
    33. Integer.TryParse(sGesplitteteZeile(0), iZeileNummer)
    34. dcZeilen.Add(iZeileNummer, sGesplitteteZeile(1))
    35. Next
    36. End Sub

    das ist natürlich völliger müll, nru dass ihr seht dass ich keinen vorgefertigeten Code haben will. ich bemühe mich echt alles unter einen Hut zu bringen. aber geht nicht.
    ich verzweifle bald. :) sitze da echt immer stundenland und probiere und probiere, dann denke ich hab es, dann teste ich, dannn passt es doch wiede nicht in manchen konstellationen. frusttrierend.



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

    @Gottric Also bei mir sieht das ganze so aus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Zeile(7) As String
    3. Private dcZeilen As New Dictionary(Of Integer, String)
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Zeile(0) = " 1 Gelb"
    6. Zeile(1) = " 7 Grün"
    7. Zeile(2) = " 12 Orange"
    8. Zeile(3) = " 73 Apfel"
    9. Zeile(4) = " 420 Blau"
    10. Zeile(5) = " 735 Auto"
    11. Zeile(6) = " 4587 Rot"
    12. Zeile(7) = " 7395 Laptop"
    13. End Sub
    14. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    15. For Each sTeile In Zeile
    16. Dim sGesplitteteZeile() As String = sTeile.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)
    17. Dim iZeileNummer As Integer
    18. Integer.TryParse(sGesplitteteZeile(0), iZeileNummer)
    19. dcZeilen.Add(iZeileNummer, sGesplitteteZeile(1))
    20. Next
    21. End Sub
    22. End Class
    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!
    Nun stellt sich mir die Frage was ist denn "die richtige stelle", und was soll dort dann rein geschrieben werden?
    "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