Geänderte Strings in der Tb Replacen

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Xylon.

    Geänderte Strings in der Tb Replacen

    Hallo. Naja also mal wieder das alte Spiel. Ich habe ne tb in der immer Codes Zeilenweise aufgelistet sind. Weiß allerdings nicht wo. So und nun muss ich jeden Zeilen Anfang überprüfen und wenn etwas gefunden wurde muss
    1. Der Wert verändert werden
    2. Weitergesucht werden
    3. In der 2. Tb alle Codes aus der tb1 ausgeben werden, nur halt mit den richtigen Werten. Die mathematischen sachen habe ich alle schon.

    Ich dachte ich kann einfach von der ersten Zeile bis zur letzten durch gehen also mit

    VB.NET-Quellcode

    1. For i as Integer = 1 to TextBox1.Lines.Length
    2. Next


    So was in der Art. Dann würde ich ebenso mit dem überprüfen vorgehen:

    VB.NET-Quellcode

    1. For each line in TextBox1.Lines
    2. If line.StartsWith("04") Then
    3. ' hier rechnen
    4. ElseIf line.StartsWith("C2") Then
    5. 'hier rechnen
    6. End If
    7. Next


    Das Problem hier bei wäre den Index von der Zeile zu überprüfen die gerade untersucht wird. Da dachte ich mit einfach IndexOf(line). Tjaha aber erstens bekomme ich da immer 0 ausgegeben und außerdem wie schaffe ich es dann in der tb2 den Text der tb1 auszugeben, wo jede veränderte Zeile replaced werden soll?

    Das einzige Problem bei der ganzen Sache ist das ich nicht weiß wo welcher Wert steht.

    In der tb könnte sowas stehen:

    Spoiler anzeigen

    0434E023 00000003
    C230840E 00000002
    80023003 00023030
    60000000 00000000
    04023040 03230000


    Genauso gut sowas:

    Spoiler anzeigen

    28340034 00000002
    C2044204 00103000
    90003203 00120003
    23003200 0004000C
    00440304 00000023
    043400EF 00230000
    04230002 00CCEE0
    E0000000 80008000


    Es sollen nur die Zeilen erkannt und umgerechnet werden wo C2 oder 04 am Anfang steht. Und ich muss den Index also die Position wissen wo das Programm gerade sucht um rechnen zu können.

    Irgendwelche Vorschläge? ?(
    Probier mal sowas in der Art:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. For i As Integer = 0 To TextBox1.Lines.Length - 1
    3. If TextBox1.Lines(i).StartsWith("04") OrElse TextBox1.Lines(i).StartsWith("C2") Then
    4. MessageBox.Show(String.Format("Match in Zeile {0}: '{1}'", i + 1, TextBox1.Lines(i)))
    5. End If
    6. Next
    7. End Sub
    Hmmm hoffentlich klappt das...

    Edit:
    Okay nun ich denke das könnte hinhauen. Und ich hab auch meinen Fehler gefunden. Hier passiert nämlich das selbe. Der Index ist immer in der Zeile heißt also z.B. 2 oder 3. Ich rechne ja nur mit einem Teil in jener Zeile. Ich bin mir sicher man kann irgendwie den Index in der TextBox anstatt der Zeile bestimmen? Die i Variable bestimmt ja nur die Zeile und mit IndexOf geht das nicht...

    Dachte an sowas:

    VB.NET-Quellcode

    1. TextBox1.Text.IndexOf(TextBox1.Lines(i))


    aber kommt mir komisch vor :pinch:

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

    Machs halt so:

    VB.NET-Quellcode

    1. Dim IndexCounter As Integer = 0
    2. For i As Integer = 0 To TextBox1.Lines.Length - 1
    3. If TextBox1.Lines(i).StartsWith("04") OrElse TextBox1.Lines(i).StartsWith("C2") Then
    4. MessageBox.Show(String.Format("Match in Zeile {0} (bei Zeichen {1}): '{2}'", i + 1, IndexCounter, TextBox1.Lines(i)))
    5. End If
    6. IndexCounter += TextBox1.Lines(i).Length
    7. Next
    @nafets3646: Nee das funzt nich, wenn ich einen Counter mache scheint der nicht mehr weiter zu laufen... Ich brauch ja einfach nur den Index von dem jetzigen Zeilenanfang. Kann man das nicht mit dem schon vorhandenen Code machen?
    Tja seltsam bei mir stoppt es. Hier mein ganzer Code: (Bitte nicht erschrecken, kleiner gings nicht XD)

    VB.NET-Quellcode

    1. Dim IndexCounter As Integer = 0
    2. For i As Integer = 0 To TextBox1.Lines.Length - 1
    3. If TextBox1.Lines(i).StartsWith("04") Then
    4. IndexCounter += TextBox1.Lines(i).Length
    5. Dim index As Integer = IndexCounter
    6. Dim adress As String = Mid(TextBox1.Text, index, 9)
    7. Dim adressandvalue = Mid(TextBox1.Text, index, 19)
    8. Dim value As String = Mid(adressandvalue, 11, 9)
    9. Dim adressvalue As String = Mid(adress, 4, 9)
    10. 'Dies ist der endindex(mid)
    11. Dim indexofadressvalue = HextoDec(adressvalue) / 4 * 8
    12. 'echte value
    13. Dim realadressvalue = Mid(RichTextBox3.Text, CInt(indexofadressvalue), 8)
    14. Dim realadressvalueplusnextvalue As String = Mid(RichTextBox3.Text, CInt(indexofadressvalue), 16)
    15. Dim region As String = Mid(RichTextBox3.Text, 1, CInt(indexofadressvalue))
    16. Dim count As Integer = CInt(StrCount(region, realadressvalueplusnextvalue)) + 1 'realadressvalue)
    17. Dim indexofvaluein2dump As Integer = IndexOfNthContent(RichTextBox2.Text, realadressvalueplusnextvalue, count) 'realadressvalue
    18. Dim thisinhex = indexofvaluein2dump / 8 * 4
    19. Dim endvalue = Hex(thisinhex)
    20. MessageBox.Show(String.Format("Match in Zeile {0}: '{1}'", i + 1, TextBox1.Lines(i)))
    21. MsgBox(endvalue)
    22. ElseIf TextBox1.Lines(i).StartsWith("C2") Then
    23. Dim indexC = i
    24. Dim adressC As String = Mid(TextBox1.Text, indexC, 9)
    25. Dim adressandvalueC = Mid(TextBox1.Text, indexC, 19)
    26. Dim valueC = Mid(adressandvalueC, 11, 9)
    27. Dim firsttwoC = Mid(TextBox1.Text, indexC, 3)
    28. Dim adressvalueC = Mid(adressC, 4, 9)
    29. 'position des wertes
    30. Dim valueXC = HextoDec(adressvalueC) / 4 + 1
    31. 'erste position
    32. Dim valXC = valueXC * 8 - 7
    33. 'wert der adresse
    34. Dim valC = Mid(RichTextBox3.Text, CInt(valXC), 8)
    35. 'rausfinden der anzahl
    36. Dim regXC = Mid(RichTextBox3.Text, 1, CInt(valueXC * 8))
    37. Dim regXIC = Mid(RichTextBox3.Text, 1, CInt(valueXC * 8))
    38. Dim tXC = Split(regXIC, valC, CInt(valueXC))
    39. Dim resultXC = UBound(tXC)
    40. Dim resXC As Integer = IndexOfNthContent(RichTextBox2.Text, valC, resultXC)
    41. Dim inhexXC As String = CStr(resXC / 8 * 4)
    42. MessageBox.Show(String.Format("Match in Zeile {0}: '{1}'", i + 1, TextBox1.Lines(i)))
    43. End If
    44. Next


    Habs jetzt erstmal nur für 04 getestet und da passiert dann irgendwann nix mehr.

    @Artentus: Ich brauche lediglich den Index der Zeile weil ich von da an mit Mid arbeiten kann. Ich brauche nur den Wert ab dem dritten Zeichen in der besagten Zeile und von da aus halt die nächsten 6.

    Xylon schrieb:

    Mid
    Ich hoffe das war ein Vertipper und du meintest Substring.

    Und zu deinem Problem: ist doch eindeutig, du erhöhst den Index nur im ersten If-zweig, du musst ihn aber immer erhöhen, egal wie die Zeile anfängt. Das hat nafets aber eigentlich schon vorgemacht, indem er die Anweisung eben außerhalb des Ifs gestellt hat.
    Nunja ist ja nicht dramatisch, lässt sich ja anpassen. Allerdings finde ich es komisch das der mir den Index 33 ausgibt obwohl ich den Index 16 erwartet hätte....irgendwas mache ich glaube ich falsch. Ich hab den Counter jetzt in die For Schleife außerhalb der If-Abfrage aber der Index ist zu hoch. Kann es sein das dieser Code mit den Index das letzten Zeichens ausgibt? Zufälligerweise sind das nämlich 33 Zeichen. Wie gesagt ich brauch eigentlich den Index der Zeile, aber wenn wenigstens das Letzte Zeichen der Index ist kann ich damit auch arbeiten (ich ziehe davon einfach 17 ab dann hab ich den Anfangsindex den ich brauche).
    Passt schon xD funktioniert ja jetzt alles bestens, hab die Variablen jetzt geändert und so. Das Problem ist jetzt noch die Ausgabe. scheinbar geht der ja schön Zeile für Zeile. Einziges Problem: In der tb2 soll das gleiche stehen wie in der tb1 nur halt mit den geänderten Werten. Geht das? Wenn nicht ists auch nicht sooo schlimm dann muss ich halt versuchen die immer anzuhängen oder so.

    Xylon schrieb:

    VB.NET-Quellcode

    1. TextBox1.Text.IndexOf(TextBox1.Lines(i))
    Das schreit dochj nach List(Of String).
    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!