An bestimmter Stelle in Textdatei schreiben

  • VB.NET

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

    An bestimmter Stelle in Textdatei schreiben

    Hallo zusammen,

    es ist wieder soweit. Ich stecke fest. :)
    Kurz zum Hintergrund. Mein Programm soll eine Datei überprüfen ob eine bestimmte Nummer dort vorhanden ist, wenn nicht soll er die Datei anlegen funktioniert alles Top.
    Das einzige Problem was sich bis jetzt zeigt ist dass ich ebenfalls in der Datei schreiben will die ich durchsuche, aber er schreibt mir immer alles ans Ende der Datei.
    Ich hätte gerne dass er mir die Zahl die ich anlege an hinter die nächst kleinere Zahl schreibt in der Datei. Also das die Auflistung beibehalten bleibt. Die Datei ist eine Directory Datei. Es sind Zahlen von 1-9999 darin untereinander geschrieben und dahinter noch ein kleiner Text, aber mit einem Leerzeichen getrennt.

    Kurzes Beispiel:
    7894 Test 1
    7895 Test 2
    7897 Test 3

    Mein Programm überprüft zu Beispiel jetzt ob die Zahl 7896 in der Datei vorhanden ist. ist sie nicht also leg ich sie an aber wie bekomm ich hin dass er mir die Zahl an die richtige Stelle in der Datei schreibt?

    Mein Code den ich bis jetzt habe:

    VB.NET-Quellcode

    1. Private Sub btnGO_Click(sender As Object, e As EventArgs) Handles btnGO.Click
    2. If txtPrgNr.TextLength = 4 Then
    3. If ComboBox1.SelectedIndex = -1 Then
    4. MsgBox("Es muss ein Roboter ausgewählt werden!", MsgBoxStyle.Critical, "Fehler")
    5. Else
    6. Dim selectedItem As Object
    7. selectedItem = ComboBox1.SelectedItem
    8. If selectedItem.ToString() = "Roboter 2.1" Then
    9. Dim dir21prg As String = System.IO.File.ReadAllText(Pfadprg21prg + "prg__dir.dat")
    10. Dim dir21dbk As String = System.IO.File.ReadAllText(Pfadprg21dbk + "dbk__dir.dat")
    11. If dir21prg.Contains(txtPrgNr.Text) Or dir21dbk.Contains(txtPrgNr.Text) Then
    12. MsgBox("Nummer ist schon vergeben!", MsgBoxStyle.Information, "Info")
    13. Else
    14. Select Case MsgBox(("Programmnummer " + txtPrgNr.Text + " ist verfügbar an Roboter 2.1" & vbCrLf & vbCrLf & "Programm und Datenbank erstellen?"), MsgBoxStyle.YesNo, "Abfrage")
    15. Case MsgBoxResult.Yes
    16. System.IO.File.AppendAllText(Pfadprg21prg + "prg__dir.dat", " " + (txtPrgNr.Text) + " " + (txtDir.Text))
    17. IO.File.WriteAllLines(Pfadprg21prg + "prg_" + (txtPrgNr.Text) + ".dat", txtPrginhalt.Lines)
    18. IO.File.WriteAllLines(Pfadprg21dbk + "dbk_" + (txtPrgNr.Text) + ".dat", txtDbkinhalt.Lines)
    19. Case MsgBoxResult.No
    20. End Select
    21. End If
    22. End If
    23. End If
    24. Else
    25. MsgBox("Es müssen 4 Zahlen eingegeben werden!", MsgBoxStyle.Critical, "Fehler")
    26. End If
    27. End Sub



    Ich bin mir sicher einer von euch kann mir helfen.

    Gottric schrieb:

    Mein Programm überprüft zu Beispiel jetzt ob die Zahl 7896 in der Datei vorhanden ist. ist sie nicht also leg ich sie an aber wie bekomm ich hin dass er mir die Zahl an die richtige Stelle in der Datei schreibt?
    Der schnellste, aber vermutlich ressourcenintensivste Weg wäre es, dir die Datei per .ReadAllLines() in eine List(Of String) lesen zu lassen, die Strings in der List Element für Element zu überprüfen (nicht mit foreach sondern mit for, den index brauchste noch) und wenn was fehlt, kannste per .Insert() einen neuen Eintrag hinzufügen.
    Wenn du alles ausgebessert hast, schreibste die Liste mit .WriteAllLines() wieder zurück.

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

    Hallo Gottric,

    probiers mal damit:

    Es wird die letzte Programmnummer gesucht die vor der freien Nummer vorhanden ist und die neue dann nach dieser eingetragen.

    Die Variabeln für den Code:

    VB.NET-Quellcode

    1. Dim exitWhile As Boolean = False
    2. Dim txtPrgNr_Int As Integer = CInt(txtPrgNr)
    3. Dim String1, String2 As String


    Folgenden Code in deine Abfrage einbinden oder du erstellst dir eine Funktion daraus:

    VB.NET-Quellcode

    1. While exitWhile = False
    2. txtPrgNr_Int -= 1
    3. If dir21prg.Contains(txtPrgNr_Int) Then
    4. String1 = dir21prg.Substring(0, dir21prg.IndexOf(txtPrgNr_Int))
    5. String2 = dir21prg.Substring(dir21prg.IndexOf(txtPrgNr_Int))
    6. String2 = String2.Insert(String2.IndexOf(vbNewLine), vbNewLine & txtPrgNr & " Test") '<-- Hier findet der neue Eintrag statt
    7. dir21prg = String1 & String2
    8. 'Debug.Print(dir21prg)
    9. exitWhile = True
    10. End If
    11. End While


    Ich hoffe es bringt dich etwas weiter

    Gruß Alex

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

    Irgendwie geht versteh ich das nicht.
    Hinter der Zahl soll ja noch ein Text. wie soll ich das mit Internger machen?
    ich hab schon an .Startswith gedacht. aber wie bekomm ich dahinein dass ich die Linie haben will die nach der nächst kleineren Zahl kommt die ich anlege?

    7894 Test 1
    7895 Test 2
    7899 Test 3

    Wenn ich jetzt die 7898 anlege soll er sie so schreiben

    7894 Test 1
    7895 Test 2
    7898
    7954 Test 3

    Edit:
    Noch einen Lösungsansatz den ich im Kopf habe ist dass ich einfach irgendwo hinschreibe in die erste Zeile und da die Directory datei immer mit ner Zahl beginnt diese einfach vor dem speichern nach Zahlen sortiere. Oder ist das zu kompliziert gedacht?
    @Gottric Lies den Text in eine List(Of String) ein, dazu gibt es den Befehl ARRAY.ToList().
    Gehe die Zeilen dieser List durch und ordne sie neu, füge ein, lösche.
    Wenn Du fertig bist, speichere sie ab, mit LIST.ToArray().
    Wie es @EaranMaleasi geschrieben hat.
    Gib die editierten Zeilen in einer RichTextBox zur Kontrolle aus, nutze deren Property .Lines.
    Feddich.
    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!

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

    Gottric schrieb:


    Hinter der Zahl soll ja noch ein Text. wie soll ich das mit Internger machen?
    ...
    Wenn ich jetzt die 7898 anlege soll er sie so schreiben

    7894 Test 1
    7895 Test 2
    7898
    7954 Test 3

    Genau das macht ja meine Schleife.

    Ich kommentier dir mal den Code:

    VB.NET-Quellcode

    1. Dim exitWhile As Boolean = False ' Eine Variable um die While-Schleife zu beenden
    2. Dim txtPrgNr_Int As Integer = CInt(txtPrgNr) ' Dein String txtPrNr (zB. 7898) wird in ein Integer umgewandelt um damit rückwärts zählen zu können.
    3. Dim String1, String2 As String ' Diese 2 Strings benötigen wir für den Inhalt der Datei

    VB.NET-Quellcode

    1. ' Durchlauf starten solange bis exitWhile = true ist.
    2. While exitWhile = False
    3. txtPrgNr_Int -= 1 ' Die Programmnummer (7898) wird bei jedem Durchlauf um 1 veringert (7897, 7896 ...)
    4. ' Nun wird abgefragt ob die um jeweils 1 veringerte Programmnummer in deinem String vorhanden ist
    5. If dir21prg.Contains(txtPrgNr_Int) Then
    6. ' Wenn Ja, dann ...
    7. String1 = dir21prg.Substring(0, dir21prg.IndexOf(txtPrgNr_Int)) ' Dein Inhalt in dir21prg wird nun nach dieser verringerten Nummer durchsucht und abgeschnitten
    8. String2 = dir21prg.Substring(dir21prg.IndexOf(txtPrgNr_Int)) ' In String 2 wird der Rest des Inhaltes festgehalten
    9. String2 = String2.Insert(String2.IndexOf(vbNewLine), vbNewLine & txtPrgNr & " Test") ' Hier findet der neue Eintrag statt: "7898 Test"
    10. dir21prg = String1 & String2 ' Beide Strings werden wieder in deinem String zusammen gefügt.
    11. 'Debug.Print(dir21prg) ' Ausgabe im Direktfenster zur Kontrolle
    12. exitWhile = True ' While-Schleife beenden
    13. End If
    14. End While


    Inhalt deines dir21prg Strings:
    7894 Test 1
    7895 Test 2
    7899 Test 3

    Inhalt der txtPrgNr_Int Variable ist am Anfang:
    7898

    Zeile 5: Wenn die IF-Anweisung wahr ist enthält die txtPrgNr_Int dann:
    7895

    Zeile 8/9: Der Inhalt von dir21prg wird dann in 2 Strings geschnitten:
    String1 beinhaltet dann:
    7894 Test 1

    String2 entählt dann:
    7895 Test 2
    7899 Test 3

    Zeile 10:
    Da in jeder Zeile am Ende ein unsichtbares CR (Enter) steht, suchen wir danach (vbNewLine) und fügen den neuen Eintrag ein:
    vbNewLine (ein Enter eintragen)
    txtPrgNr (deine vorhandene Programmnummer 7898 eintragen)
    " Test" (Ein neuer Text hinter deiner Programmnummer eintragen)

    Zeile 12: Nun wird String1 und String2 wieder zusammengefügt und in die dir21prg Variable eingetragen.
    Nun steht in deiner dir21prg folgendes:
    7894 Test 1
    7895 Test 2
    7898 Test
    7899 Test 3


    Gruß Alex
    Dim txtPrgNr_Int As Integer = CInt(txtPrgNr)

    wenn ich das genauso schreibe. oder meinst du wo ich das hinschreibe?
    dann nach der Abfrage ob die Datei erstellt werden soll.

    VB.NET-Quellcode

    1. Private Sub btnGO_Click(sender As Object, e As EventArgs) Handles btnGO.Click
    2. If txtPrgNr.TextLength = 4 Then
    3. If ComboBox1.SelectedIndex = -1 Then
    4. MsgBox("Es muss ein Roboter ausgewählt werden!", MsgBoxStyle.Critical, "Fehler")
    5. Else
    6. Dim selectedItem As Object
    7. selectedItem = ComboBox1.SelectedItem
    8. If selectedItem.ToString() = "Roboter 2.1" Then
    9. Dim dir21prg As String = System.IO.File.ReadAllText(Pfadprg21prg + "prg__dir.dat")
    10. Dim dir21dbk As String = System.IO.File.ReadAllText(Pfadprg21dbk + "dbk__dir.dat")
    11. If dir21prg.Contains(txtPrgNr.Text) Or dir21dbk.Contains(txtPrgNr.Text) Then
    12. MsgBox("Nummer ist schon vergeben!", MsgBoxStyle.Information, "Info")
    13. Else
    14. Select Case MsgBox(("Programmnummer " + txtPrgNr.Text + " ist verfügbar an Roboter 2.1" & vbCrLf & vbCrLf & "Programm und Datenbank erstellen?"), MsgBoxStyle.YesNo, "Abfrage")
    15. Case MsgBoxResult.Yes
    16. Dim txtPrgNr_Int As Integer = CInt(txtPrgNr)
    17. System.IO.File.AppendAllText(Pfadprg21prg + "prg__dir.dat", " " + (txtPrgNr.Text) + " " + (txtDir.Text))
    18. IO.File.WriteAllLines(Pfadprg21prg + "prg_" + (txtPrgNr.Text) + ".dat", txtPrginhalt.Lines)
    19. IO.File.WriteAllLines(Pfadprg21dbk + "dbk_" + (txtPrgNr.Text) + ".dat", txtDbkinhalt.Lines)
    20. Case MsgBoxResult.No
    21. End Select
    22. End If
    23. End If
    24. End If
    25. Else
    26. MsgBox("Es müssen 4 Zahlen eingegeben werden!", MsgBoxStyle.Critical, "Fehler")
    27. End If
    28. End Sub


    Das einrücken funktioniert jetzt nicht weil ich den text von oben kopiert haeb ich es nur an der Stelle eingefügt habe jetzt. Ich bin über nen anderen PC online, der auf dem ich das Prg. schreibe ist offline.

    Edit2:
    Dim txtPrgNr_Int As Integer = CInt(txtPrgNr.text) so funktioniert es.

    aber er sagt jetzt das .Contains und mit Index Of()
    Option Strict ON lässt keine Konvertierung von Integer zu String zu.

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

    Sehr gut bemerkt. Hatte .Text vergessen bei der Übergabe.



    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim exitWhile As Boolean = False ' Eine Variable um die While-Schleife zu beenden
    3. Dim txtPrgNr_Int As Integer = CInt(txtPrgNr.text) ' Dein String txtPrNr (zB. 7898) wird in ein Integer umgewandelt um damit rückwärts zählen zu können.
    4. Dim String1, String2 As String ' Diese 2 Strings benötigen wir für den Inhalt der Datei
    5. Dim dir21prg As String
    6. Dim dir21dbk As String
    7. Private Sub btnGO_Click(sender As Object, e As EventArgs) Handles btnGO.Click
    8. If txtPrgNr.TextLength = 4 Then
    9. If ComboBox1.SelectedIndex = -1 Then
    10. MsgBox("Es muss ein Roboter ausgewählt werden!", MsgBoxStyle.Critical, "Fehler")
    11. Else
    12. Dim selectedItem As Object
    13. selectedItem = ComboBox1.SelectedItem
    14. If selectedItem.ToString() = "Roboter 2.1" Then
    15. dir21prg = System.IO.File.ReadAllText(Pfadprg21prg + "prg__dir.dat")
    16. dir21dbk = System.IO.File.ReadAllText(Pfadprg21dbk + "dbk__dir.dat")
    17. If dir21prg.Contains(txtPrgNr.Text) Or dir21dbk.Contains(txtPrgNr.Text) Then
    18. MsgBox("Nummer ist schon vergeben!", MsgBoxStyle.Information, "Info")
    19. Else
    20. Select Case MsgBox(("Programmnummer " + txtPrgNr.Text + " ist verfügbar an Roboter 2.1" & vbCrLf & vbCrLf & "Programm und Datenbank erstellen?"), MsgBoxStyle.YesNo, "Abfrage")
    21. Case MsgBoxResult.Yes
    22. '#################################
    23. ' Durchlauf starten solange bis exitWhile = true ist.
    24. While exitWhile = False
    25. txtPrgNr_Int -= 1 ' Die Programmnummer (7898) wird bei jedem Durchlauf um 1 veringert (7897, 7896 ...)
    26. ' Nun wird abgefragt ob die um jeweils 1 veringerte Programmnummer in deinem String vorhanden ist
    27. If dir21prg.Contains(txtPrgNr_Int.ToString) Then
    28. ' Wenn Ja, dann ...
    29. String1 = dir21prg.Substring(0, dir21prg.IndexOf(txtPrgNr_Int)) ' Dein Inhalt in dir21prg wird nun nach dieser verringerten Nummer durchsucht und abgeschnitten
    30. String2 = dir21prg.Substring(dir21prg.IndexOf(txtPrgNr_Int)) ' In String 2 wird der Rest des Inhaltes festgehalten
    31. String2 = String2.Insert(String2.IndexOf(vbNewLine), vbNewLine & txtPrgNr & " Test") ' Hier findet der neue Eintrag statt: "7898 Test"
    32. dir21prg = String1 & String2 ' Beide Strings werden wieder in deinem String zusammen gefügt.
    33. Debug.Print(dir21prg) ' Ausgabe im Direktfenster zur Kontrolle
    34. exitWhile = True ' While-Schleife beenden
    35. End If
    36. End While
    37. '#################################
    38. System.IO.File.AppendAllText(Pfadprg21prg + "prg__dir.dat", " " + (txtPrgNr.Text) + " " + (txtDir.Text))
    39. IO.File.WriteAllLines(Pfadprg21prg + "prg_" + (txtPrgNr.Text) + ".dat", txtPrginhalt.Lines)
    40. IO.File.WriteAllLines(Pfadprg21dbk + "dbk_" + (txtPrgNr.Text) + ".dat", txtDbkinhalt.Lines)
    41. Case MsgBoxResult.No
    42. End Select
    43. End If
    44. End If
    45. End If
    46. Else
    47. MsgBox("Es müssen 4 Zahlen eingegeben werden!", MsgBoxStyle.Critical, "Fehler")
    48. End If
    49. End Sub
    Ich versuch es gleich mal. hab es eingegeben aber bevor ich es testen öffnet Visual Studio meine Form nicht mehr.
    wenn ich auf den Button klicke der die form öffnen soll sagt er mir: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    warum auch immer. ich hab nur oben am Reiter verschoben die Fromerstellen.vb
    es ist auch noch alles da, ich kann sie nur über den Button nicht öffnen.

    er zeigte mir bei IndexOf(txtPrgNr_Int) einen Fehler. Habe dann ein ToString eingefügt.
    Fehler zeigt er nicht mehr aber wie gesagt, ich kann die Form nicht öffnen wenn ich die Anwendung debugge.

    Zur Not lösche ich die Form und leg alles neu an.

    Edit:

    Obwohl ich die Form gelöscht habe und alles neu erstellt habe steigt meine Anwendung aus wenn ich sie aufrufen will. die 5 anderen Formen die ich über die Startform auswählen kann öffenen ganz normal.
    Aber die eine nicht, obwohl ich sie aus dem Projekt gelöscht habe und sie neu angelegt habe. ganz komisch.
    jemand ne Idee?

    Edit2:

    Hat lange gedauert aber hab den Fehler gefunden.
    Hahahaha, der war gut itAxel. :)

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

    @Gottric Wenn da in Deinem Ablauf eine MessageBox kommt, weil etwas nicht stimmt, überlege, wie da der Programmfluss sein soll.
    Üblicherweise sollte da ein Return oder ein Return False stehen.
    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,
    sorry dass es so lange gedauert hat und danke an euch. Hier zum Abschluss der fertige Code der auch ohne Probleme funktioniert.

    VB.NET-Quellcode

    1. Private Sub btnGO_Click(sender As Object, e As EventArgs) Handles btnGO.Click
    2. If txtPrgNr.TextLength <> 4 Then
    3. MsgBox("Es müssen 4 Zahlen eingegeben werden!", MsgBoxStyle.Critical, "Fehler")
    4. Else
    5. If ComboBox1.SelectedIndex = -1 Then
    6. MsgBox("Es muss ein Roboter ausgewählt werden!", MsgBoxStyle.Critical, "Fehler")
    7. Else
    8. Dim exitWhile21 As Boolean = False
    9. Dim txtPrgNr_Int21 As Integer = CInt(txtPrgNr.Text)
    10. Dim String1_21, String2_21 As String
    11. Dim dir21prg As String
    12. Dim dir21dbk As String
    13. Dim selectedItem21 As Object
    14. selectedItem21 = ComboBox1.SelectedItem
    15. If selectedItem21.ToString() = "Roboter 2.1" Then
    16. dir21prg = System.IO.File.ReadAllText(Pfadprg21prg + "prg__dir.dat")
    17. dir21dbk = System.IO.File.ReadAllText(Pfadprg21dbk + "dbk__dir.dat")
    18. If dir21prg.Contains(txtPrgNr.Text) Or dir21dbk.Contains(txtPrgNr.Text) Then
    19. MsgBox("Nummer ist schon vergeben an Roboter 2.1!", MsgBoxStyle.Information, "Info")
    20. Else
    21. Select Case MsgBox(("Programmnummer " + txtPrgNr.Text + " ist verfügbar an Roboter 2.1" & vbCrLf & vbCrLf & "Programm und Datenbank erstellen?"), MsgBoxStyle.YesNo, "Abfrage")
    22. Case MsgBoxResult.Yes
    23. While exitWhile21 = False
    24. txtPrgNr_Int21 -= 1
    25. If dir21prg.Contains(txtPrgNr_Int21.ToString) Then
    26. String1_21 = dir21prg.Substring(0, dir21prg.IndexOf(txtPrgNr_Int21.ToString))
    27. String2_21 = dir21prg.Substring(dir21prg.IndexOf(txtPrgNr_Int21.ToString))
    28. String2_21 = String2_21.Insert(String2_21.IndexOf(vbNewLine), vbNewLine & " " + txtPrgNr.Text & " " + txtDir.Text)
    29. dir21prg = String1_21 & String2_21
    30. End If
    31. If dir21dbk.Contains(txtPrgNr_Int21.ToString) Then
    32. String1_21 = dir21dbk.Substring(0, dir21dbk.IndexOf(txtPrgNr_Int21.ToString))
    33. String2_21 = dir21dbk.Substring(dir21dbk.IndexOf(txtPrgNr_Int21.ToString))
    34. String2_21 = String2_21.Insert(String2_21.IndexOf(vbNewLine), vbNewLine & " " + txtPrgNr.Text & " " + txtDir.Text)
    35. dir21dbk = String1_21 & String2_21
    36. exitWhile21 = True
    37. End If
    38. End While
    39. IO.File.WriteAllText(Pfadprg21prg + "prg__dir.dat", dir21prg)
    40. IO.File.WriteAllLines(Pfadprg21prg + "prg_" + (txtPrgNr.Text) + ".dat", txtPrginhalt.Lines)
    41. IO.File.WriteAllText(Pfadprg21dbk + "prg__dir.dat", dir21dbk)
    42. IO.File.WriteAllLines(Pfadprg21dbk + "dbk_" + (txtPrgNr.Text) + ".dat", txtDbkinhalt.Lines)
    43. Case MsgBoxResult.No
    44. End Select
    45. End If
    46. End If
    47. End If
    48. End If
    49. End Sub


    Ich warte bis morgen, vielleicht habt ihr ja was anzumerken. Dann schließe ich das Thema.

    Gottric schrieb:

    vielleicht habt ihr ja was anzumerken.
    Jou.
    Bei so vielen verschachtelten Ifs verlierst Du schnell den Überblick.
    Sieh Dir mal dies an:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub btnGO_Click(sender As Object, e As EventArgs) Handles btnGO.Click
    2. If txtPrgNr.TextLength <> 4 Then
    3. MessageBox.Show("Es müssen 4 Zahlen eingegeben werden!", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    4. Return
    5. End If
    6. If ComboBox1.SelectedIndex = -1 Then
    7. MessageBox.Show("Es muss ein Roboter ausgewählt werden!", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    8. Return
    9. End If
    10. If ComboBox1.SelectedItem.ToString() <> "Roboter 2.1" Then
    11. Return
    12. End If
    13. Dim dir21prg = System.IO.File.ReadAllText(Pfadprg21prg + "prg__dir.dat")
    14. Dim dir21dbk = System.IO.File.ReadAllText(Pfadprg21dbk + "dbk__dir.dat")
    15. If dir21prg.Contains(txtPrgNr.Text) OrElse dir21dbk.Contains(txtPrgNr.Text) Then
    16. MessageBox.Show("Nummer ist schon vergeben an Roboter 2.1!", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information)
    17. Return
    18. End If
    19. If MessageBox.Show(("Programmnummer " + txtPrgNr.Text + " ist verfügbar an Roboter 2.1" & vbCrLf & vbCrLf & "Programm und Datenbank erstellen?"), "Abfrage", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.No Then
    20. Return
    21. End If
    22. Dim String1_21, String2_21 As String
    23. Dim exitWhile21 As Boolean = False
    24. Dim txtPrgNr_Int21 As Integer = CInt(txtPrgNr.Text)
    25. While exitWhile21 = False
    26. txtPrgNr_Int21 -= 1
    27. If dir21prg.Contains(txtPrgNr_Int21.ToString) Then
    28. String1_21 = dir21prg.Substring(0, dir21prg.IndexOf(txtPrgNr_Int21.ToString))
    29. String2_21 = dir21prg.Substring(dir21prg.IndexOf(txtPrgNr_Int21.ToString))
    30. String2_21 = String2_21.Insert(String2_21.IndexOf(vbNewLine), vbNewLine & " " + txtPrgNr.Text & " " + txtDir.Text)
    31. dir21prg = String1_21 & String2_21
    32. End If
    33. If dir21dbk.Contains(txtPrgNr_Int21.ToString) Then
    34. String1_21 = dir21dbk.Substring(0, dir21dbk.IndexOf(txtPrgNr_Int21.ToString))
    35. String2_21 = dir21dbk.Substring(dir21dbk.IndexOf(txtPrgNr_Int21.ToString))
    36. String2_21 = String2_21.Insert(String2_21.IndexOf(vbNewLine), vbNewLine & " " + txtPrgNr.Text & " " + txtDir.Text)
    37. dir21dbk = String1_21 & String2_21
    38. exitWhile21 = True
    39. End If
    40. End While
    41. IO.File.WriteAllText(Pfadprg21prg + "prg__dir.dat", dir21prg)
    42. IO.File.WriteAllLines(Pfadprg21prg + "prg_" + (txtPrgNr.Text) + ".dat", txtPrginhalt.Lines)
    43. IO.File.WriteAllText(Pfadprg21dbk + "prg__dir.dat", dir21dbk)
    44. IO.File.WriteAllLines(Pfadprg21dbk + "dbk_" + (txtPrgNr.Text) + ".dat", txtDbkinhalt.Lines)
    45. 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!
    Nein, außer du bearbeitest viele Milliarden Datensätze.

    Artikel die sich mit Branch Prediction von CPUs beschäftigen behaupten, dass gewisse Abzweigungen in einem Programm sich durchaus negativ auf die Leistung auswirken können. Rät CPU falsch wohin es als nächstes geht, muss die aktuelle Pipeline geleert und neu befüllt werden usw. Dabei sprechen wir hier von Nanosekunden die verloren gehen.

    Wie genau das alles abläuft kann ich dir nicht sagen, merk dir einfach folgendes:
    Halte es für dich übersichtlich, dann machste der CPU auch ne freude.
    Hallo zusammen, ich greife diese Thema wieder auf da sich die Anforderungen an meine Anwendung geändert haben.
    mit dem momentanen Code kann ich nur 4stellige Zahlen anlegen. weil diese in der Datei ja nur 1 mal vorkommen kann. Datei hat Zahlen von 1-9999
    jetzt nach einer Testphase hat sich herausgestellt dass es wesentlich produktiver wäre wenn ich alle Zahlen anlegen könnte.
    Momentan überprüfe ich ja mit Contains. aber bei der Zahl 73 zum Beispiel kommt diese ja wensentlich öfter vor. zum Beispiel in 7300; 473; 8736 etc.
    Wenn ich starswith verwende kommt sie ja auch öfter vor. Beispiel 7300; 736; 739 etc.
    Ich muss also irgnedwie hinbekommen dass er mir nur die zahl die ich auch wirklich in der txt eintrage dafür verwende. wie stelle ich denn das sicher?
    er also mit Contains nur wirklich die 73 sucht und nicht alle anderen auch wo ne 73 drin vorkommt.

    VB.NET-Quellcode

    1. 'Roboter 2.1
    2. Dim exitWhile21prg As Boolean = False ' Eine Variable um die While-Schleife zu beenden
    3. Dim exitWhile21dbk As Boolean = False ' Eine Variable um die While-Schleife zu beenden
    4. Dim txtNr_Int21dbk As Integer = CInt(txtDbkNr.Text)
    5. Dim txtNr_Int21prg As Integer = CInt(txtPrgNr.Text) ' Dein String txtPrNr (zB. 7898) wird in ein Integer umgewandelt um damit rückwärts zählen zu können.
    6. Dim String1_21, String2_21 As String ' Diese 2 Strings benötigen wir für den Inhalt der Datei
    7. Dim dir21prg As String
    8. Dim dir21dbk As String
    9. Dim selectedItem21 As Object
    10. selectedItem21 = ComboBox1.SelectedItem
    11. If selectedItem21.ToString() = "Roboter 2.1" Then
    12. dir21prg = System.IO.File.ReadAllText(Pfadprg21prg + "prg__dir.dat")
    13. dir21dbk = System.IO.File.ReadAllText(Pfadprg21dbk + "dbk__dir.dat")
    14. If dir21prg.Contains(txtPrgNr.Text) Or dir21dbk.Contains(txtDbkNr.Text) Then
    15. MsgBox("Nummer ist schon vergeben an Roboter 2.1!", MsgBoxStyle.Information, "Info")
    16. Return
    17. Else
    18. '#################################
    19. ' Durchlauf starten solange bis exitWhile = true ist.
    20. 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)
    21. Case Windows.Forms.DialogResult.Yes
    22. While exitWhile21prg = False
    23. txtNr_Int21prg -= 1 ' Die Programmnummer (7898) wird bei jedem Durchlauf um 1 veringert (7897, 7896 ...)
    24. ' Nun wird abgefragt ob die um jeweils 1 veringerte Programmnummer in deinem String vorhanden ist
    25. If dir21prg.Contains(txtNr_Int21prg.ToString) Then
    26. ' Wenn Ja, dann ...
    27. String1_21 = dir21prg.Substring(0, dir21prg.IndexOf(txtNr_Int21prg.ToString)) ' Dein Inhalt in dir21prg wird nun nach dieser verringerten Nummer durchsucht und abgeschnitten
    28. String2_21 = dir21prg.Substring(dir21prg.IndexOf(txtNr_Int21prg.ToString)) ' In String 2 wird der Rest des Inhaltes festgehalten
    29. String2_21 = String2_21.Insert(String2_21.IndexOf(vbNewLine), vbNewLine & " " + txtPrgNr.Text & " " + txtDir.Text) ' Hier findet der neue Eintrag statt: "7898 Test"
    30. dir21prg = String1_21 & String2_21 ' Beide Strings werden wieder in deinem String zusammen gefügt.
    31. exitWhile21prg = True
    32. End If
    33. End While
    34. IO.File.WriteAllText(Pfadprg21prg + "prg__dir.dat", dir21prg)
    35. IO.File.WriteAllLines(Pfadprg21prg + "prg_" + addunterstrich(txtPrgNr.Text) + ".dat", txtPrginhalt.Lines)
    36. While exitWhile21dbk = False
    37. txtNr_Int21dbk -= 1
    38. If dir21dbk.Contains(txtNr_Int21dbk.ToString) Then
    39. String1_21 = dir21dbk.Substring(0, dir21dbk.IndexOf(txtNr_Int21dbk.ToString))
    40. String2_21 = dir21dbk.Substring(dir21dbk.IndexOf(txtNr_Int21dbk.ToString))
    41. String2_21 = String2_21.Insert(String2_21.IndexOf(vbNewLine), vbNewLine & " " + txtDbkNr.Text & " " + txtDir.Text)
    42. dir21dbk = String1_21 & String2_21
    43. exitWhile21dbk = True
    44. End If
    45. End While
    46. IO.File.WriteAllText(Pfadprg21dbk + "dbk__dir.dat", dir21dbk)
    47. IO.File.WriteAllLines(Pfadprg21dbk + "dbk_" + addunterstrich(txtDbkNr.Text) + ".dat", txtDbkinhalt.Lines)
    48. System.Threading.Thread.Sleep(500)
    49. MsgBox("Programm " + (txtPrgNr.Text) + " mit dazugehöriger Datenbank " + (txtDbkNr.Text) + " an Roboter 2.1 erstellt!", MsgBoxStyle.Information, "Info")
    50. Case Windows.Forms.DialogResult.No
    51. End Select
    52. End If
    53. End If


    Sorrx für die vielen editierungen

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

    @Gottric Du müsstest in den Zeilen nach Strings suchen, die einen ganzzagligen numerischen Ausdruck enthalten, das wäre dann Deine Zielgröße.
    Das geht mit RegEx, is aber nich mein Ding.
    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!