An bestimmter Stelle in Textdatei schreiben

  • VB.NET

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

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim SuchKey As String = txtDbkNr.Text
    3. Dim b As Boolean = False
    4. Dim lstDateiInhalt As New List(Of String)
    5. lstDateiInhalt.AddRange(IO.File.ReadAllLines(Pfadprg21prg + "prg__dir.dat"))
    6. For Each sTeile As String In lstDateiInhalt
    7. If sTeile.StartsWith(" " & SuchKey.Trim & " ") Then
    8. MessageBox.Show(SuchKey & " gefunden in Zeile: " & lstDateiInhalt.IndexOf(sTeile).ToString)
    9. b = True
    10. End If
    11. Next
    12. If b = False Then
    13. MessageBox.Show("Nix gefunden")
    14. End If
    15. End Sub


    Und jetzt musst du noch erklären, was du wo einfügen willst.
    (Aber so, das es außer dir auch ein Anderer vesteht). :D
    Hallo zusammen, erstmal danke ich euch dass ihr soviel gedult mit mir habt. :)
    @ErfinderDesRades ich habe deine Code eingesetzt und er arbeitet wunderbar, er sucht dann nur die Zeile und sagt mir das die nummer vorkommt am Zeilenanfang, danke dafür. Das Problem, wie ich schon erwähnte liegt in meinem alten Code. Ich muss ich der Datei erst auslesen ob die Nummer die in der Textbox eingebe dort am Zeilenafang vorhanden ist. wenn dies nicht so ist muss ich diese dort reinschreibent. Mit richtiger Position ist gemeint das so:

    Datei sieht so aus.
    " 1 Blau"
    " 2 Grün"
    " 17 Auto"
    " 35 Gelb"
    " 134 Orange"
    " 1458 Laptop"
    " 9999 Maus"

    Sagen wir ich gebe in die Textbox 35 ein, dann soll er sagen, dass die Datei schon in der Textbox existiert.
    Dann gebe ich von miraus 37 dort ein, dann muss er die Zahl Plus noch einen Text aus einer anderren Textox sagen wir Opel, hinter die nächst kleinere Zahl schreiben, quasi hinter die 35 die ja schon in der Datei steht. Es ist wichtig dass dies immer fordlaufend ist. MIt dem Code den ich habe macht er das aber nur mit 4 Stelligen Zahlen. War an Anfang auch OK, aber wie ich schon erwähnte haben sich die Anfordugnen an mein Programm geändert sodass ich nun alle Zahlen Zwischne 1-9999 dort eintragen lassen müssen und nicht nur 4 Stellige. Ich setze mich gleoch sofort, wenn mein besuch weg ist, daran eure vorschläge umzusetzten.

    Ziel ist es das die Datei dann so aufsieht wenn ich 37 in die eine und Opel in die andere textbox eingebe:

    " 1 Blau"
    " 2 Grün"
    " 17 Auto"
    " 35 Gelb"
    " 37 Opel"
    " 134 Orange"
    " 1458 Laptop"
    " 9999 Maus"

    Hoffe ich habe mich einigermaßen verständlich ausgedrückt und das keine Fragen offen geblieben sind.
    Man bräuchte also, wenn es keinen Treffer gibt,ne Liste wo man den neuen Eintrag hinzufügen kann. Dann müsste man diese Liste nach den Nummern sortieren und diese in die/eine Datei schreiben, korrekt? Demnach müsste man also gar nicht in eine bestimmte Stelle in einer Datei schreiben...
    "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

    Gottric schrieb:

    @ErfinderDesRades ich habe deine Code eingesetzt und er arbeitet wunderbar, er sucht dann nur die Zeile und sagt mir das die nummer vorkommt am Zeilenanfang, danke dafür.
    Falsch.
    (Bzw. nicht ganz richtig, und solch ist oft schwieriger, als wenns einfach falsch wäre)
    Mein Code "sagt" (ich finds grässlich, wenn Code anfängt zu "sagen") dir nicht (nur), ob die nummer vorkommt.
    Er "sagt" dir genau den Index der Zeile, wo die Nummer vorkommt.
    Und nun kann man weiter denken.

    Gottric schrieb:

    Das Problem, Ich muss ich der Datei erst auslesen ob die Nummer die in der Textbox eingebe dort am Zeilenafang vorhanden ist. wenn dies nicht so ist muss ich diese dort reinschreibent.
    Also du suchst nicht nur den Index der Zeile, die mit " 73 " beginnt, sondern - falls nicht vorhanden suchst du ausserdem noch den Index, wo eine solche Zeile einzufügen wäre.
    Und eine deiner Vorraussetzungen ist ausserdem, dass die Zeilen sortiert sind.
    Das lässt sich leicht lösen, nämlich indem du die Such-Bedingung entsprechend abwandelst, sodas die Zeile gefunden wird, die grösser oder gleich " 73" ist:

    VB.NET-Quellcode

    1. Dim insertPosition73 = lines.FindIndex(Function(line)line >= " 73")

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

    @mrMo, ich glaube wir reden aneinander vorbei. Die Datei die ich auslese sti diese Liste. Wenn die Nummer nicht vorkommt will ich sie darein schreiben an gereit an die nächste kleinere zahl.
    @ErfinderDesRades ja, genauso soll es sein.

    so, das habe ich bis jetzt.

    VB.NET-Quellcode

    1. Dim Zeile = File.ReadAllLines(Pfadprg21dbk + "dbk__dir.dat")
    2. Dim dcZeilen As New Dictionary(Of Integer, String)
    3. For Each sTeile In Zeile
    4. Dim sGesplitteteZeile() As String = sTeile.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)
    5. Dim iZeileNummer As Integer
    6. Integer.TryParse(sGesplitteteZeile(0), iZeileNummer)
    7. dcZeilen.Add(iZeileNummer, sGesplitteteZeile(1))
    8. Next


    soweit ich das beurteilen kann ich lese ich nun die Datei als Liste ein und schneide nach der Zahl die Zeile ab. Stimmt das soweit, wie muss ich nun weiter vorgehen?

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

    Was ich dir sagen wollte, als Lösungsansatz:

    1. Datei in Liste Y laden
    2. Falls Suchwort X in Liste Y nicht gefunden wird
    3. Suchwort X in Liste Y einfügen
    4. Liste sortieren
    5. Liste in neue Date oder bestehende Datei schreiben
    "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
    Also aus euren Infos habe ich nun diesen Code zusammengetragen.

    VB.NET-Quellcode

    1. Dim Zeile = File.ReadAllLines(Pfadprg21dbk + "dbk__dir.dat")
    2. Dim dcZeilen As New Dictionary(Of Integer, String)
    3. For Each sTeile In Zeile
    4. Dim sGesplitteteZeile() As String = sTeile.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)
    5. Dim iZeileNummer As Integer
    6. Integer.TryParse(sGesplitteteZeile(0), iZeileNummer)
    7. dcZeilen.Add(iZeileNummer, sGesplitteteZeile(1))
    8. Next
    9. Dim iSuchKey As Integer = Convert.ToInt16(txtDbkNr.Text)
    10. If (dcZeilen.ContainsKey(iSuchKey)) Then
    11. MsgBox("Nummer ist schon vergeben an Roboter 2.1! " & dcZeilen(iSuchKey), MsgBoxStyle.Information, "Info")
    12. Return
    13. Else
    14. Select Case MessageBox.Show("Programmnummer: " + txtPrgNr.Text + " und Datenbanknummer: " + txtDbkNr.Text + " verfügbar an Roboter 2.1" & vbCrLf & vbCrLf & "Programm und Datenbank erstellen?", "Abfrage", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)
    15. End Select
    16. End If


    Wie füge ich denn jetzt die den Inhalt aus der Textbox dort ein?

    Edit: es gilt vielleicht noch zu sagen dass es unter umständen vorkommen aknn das mehere Wörte hinter der Zahl kommen.
    " 1 Blau"
    " 2 Grün ist der Apfel"
    " 17 Auto"
    " 35 Gelb ist die Sonne"
    " 37 Opel"
    " 134 Orange"
    " 1458 Laptop hat wenig Accu"
    " 9999 Maus"
    vielleciht muss ich das ja beim Code berücksichtigen. Wollte es nur mal erwähnen. Wenn wir also die 37 Opel einfügen dürfen die anderen zeilen nicht verädnert werden, der Text muss dahinter stehen bleiben.

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

    hmm - also zumindest was mrMo sagt, finde ich in deim zusammengetragenen Code nicht wieder.
    1. Datei in Liste Y laden
    Wo ist in deim Code die Liste? Ich sehe da ein Array und ein Dictionary, aber keine Liste.
    Ohne Liste kriegst du natürlich Probleme mit
    3. Suchwort X in Liste Y einfügen
    Weil ohne Liste kann man nix in eine Liste einfügen.
    Womit in gewisser Weise ja deine Frage beantwortet ist - oder?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @ErfinderDesRades ok, ich versuche es geren so.
    warum muss ich das bei deiner methode nicht splitten? wie soll ich sonst rausfinden ob die Nummer schon am Anfang einer Zeile steht?

    VB.NET-Quellcode

    1. Dim lstDateiInhalt As New List(Of String)
    2. lstDateiInhalt.AddRange(IO.File.ReadAllLines(Pfadprg21dbk + "dbk__dir.dat"))
    3. For Each line As String In lstDateiInhalt
    4. Next

    so lade ich es in ne Liste, und wie mache ich dann weiter?

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

    Gottric schrieb:

    es gilt vielleicht noch zu sagen dass es unter umständen vorkommen aknn das mehere Wörte hinter der Zahl kommen.


    Aha, ich bin von 2 Festen Werten ausgegangen. Dann wäre es natürlich ungeschickt beim Leerzeichen zu Splitten. Ergo: Meine Variante funktioniert in diesem Fall also nicht.
    Hätte man ja vorher erwähnen 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
    schau post#44 - wird da irgendwo gesplittet?
    Und wie wird da herausgefunden, wo die gesuchte Zeile ist bzw. hingehört?

    Ich habe einfach das Problem formuliert, und dann in Code umgesetzt - ein Gesplitte ergab sich halt nicht.

    Gottric schrieb:

    wie soll ich sonst rausfinden ob die Nummer schon am Anfang einer Zeile steht?
    Das ist die falsche Problem-Definition.
    Schau nochmal in post#44, wie ich das Problem definiert hab.

    Gottric schrieb:

    so lade ich es in ne Liste, und wie mache ich dann weiter?
    schau in post#44:
    hol dir die EinfügePosition.
    Das ist der dort gezeigte Einzeiler, deine Schleife kannste auch weglassen.
    und weiter?
    Guck nach, ob an der EinfügePosition die Zeile schon steht
    noch weiter?
    wenn nicht, füge da was ein.
    wie finde ich denn die Einfügeposition?
    der einzeiler ist lines nicht definiert, als was muss ich das definieren?
    wie schaue ich ob an der einfügeposition die Zeile schon steht?
    einfügen gehe ich mal von .add aus.
    aber der Rest ist mir ein Rätesl. das ganz mit nen kleinen Beispiel zu veranschaulichen wäre sinnvoller. so bekomme ich das ja nie hin.
    noch kurz ne Frage? Meinst du das die Zeile in der " 73 Apel Auto Orange" steht ist auch in der Datei Zeile Nr. 73. dem ist nicht so.

    VB.NET-Quellcode

    1. Dim lstDateiInhalt As New List(Of String)
    2. lstDateiInhalt.AddRange(IO.File.ReadAllLines(Pfadprg21dbk + "dbk__dir.dat"))
    3. Dim insertPosition = lstDateiInhalt.FindIndex(Function(line) line >= " " & (txtDbkNr.Text)) + 1
    4. MsgBox(insertPosition.ToString)


    wenn ich jetzt aber nach 120 suche, dann sagt er mir es wäre in Zeile 2, ist es aber nicht.

    VB.NET-Quellcode

    1. Dim lstDateiInhalt As New List(Of String)
    2. lstDateiInhalt.AddRange(IO.File.ReadAllLines(Pfadprg21dbk + "dbk__dir.dat"))
    3. Dim insertposition = lstDateiInhalt.FindIndex(Function(line) line.StartsWith(" " & (txtDbkNr.Text)&" ")) + 1
    4. MsgBox(insertPosition.ToString)


    wenn ich es über starswith mache passt es glaube ich, danke.
    jetzt muss nur noch hinter der nächst kleineren Zahl eingefügt werden. wie mache ich das?

    Edit: passt doch nicht. wenn ich jetzt nach 52 suche und er die nicht findet zeigt er mir die Zeile wo die 520 am Anfang steht.
    Edit 2: wenn ichnoch ein Leerzeichen einfüge hinter dem txtDbkNr.text dann findet er nur das was er soll.

    also wie füge ich jetzt nur noch hinter der nächst kleineren Zahl eingefügt werden. wie mache ich das?

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

    Tja, wies scheint, muss man doch mit Split arbeiten - probierma

    VB.NET-Quellcode

    1. Dim num = Integer.Parse(txtDbkNr.Text.Trim)
    2. insertposition = lstDateiInhalt.FindIndex(Function(line) Integer.Parse(line.Split()(1)) >= num)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    VB.NET-Quellcode

    1. Dim lstDateiInhalt As New List(Of String)
    2. lstDateiInhalt.AddRange(IO.File.ReadAllLines(Pfadprg21dbk + "dbk__dir.dat"))
    3. Dim num = Integer.Parse(txtDbkNr.Text.Trim)
    4. Dim insertposition = lstDateiInhalt.FindIndex(Function(line) Integer.Parse(line.Split()(1)) >= num) + 1
    5. MsgBox(insertposition.ToString)
    6. If insertposition = 0 Then
    7. MsgBox("Datenbanknummer ist schon vergeben an Roboter 2.1!", MsgBoxStyle.Information, "Info")
    8. Return
    9. Else
    10. Select Case MessageBox.Show("Programmnummer: " + txtPrgNr.Text + " und Datenbanknummer: " + txtDbkNr.Text + " verfügbar an Roboter 2.1" & vbCrLf & vbCrLf & "Programm und Datenbank erstellen?", "Abfrage", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)
    11. Case Windows.Forms.DialogResult.Yes
    12. lstDateiInhalt.Add(txtDbkNr.Text + txtDir.Text)
    13. End Select
    14. End If


    das habe ich bis jetzt. ist das richtig? wenn insertposition 0 ist dann aht er nichts gefunden oder?

    Also mit dem neuen Code funktioniert es. er zählt aber immer eine Zeile zu wenig, wenn ich hinter deinen Code ne +1 stelle dann schreibt er mir die richtige Zeile. ist das richtig oder habe ich was falsch?

    also über insertposition kann ich es nicht abfragen ob es schon aufgerufen wird oder? Wie stelle ich das denn an?

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