Zeichenkette aus Array lesen

  • Hey , ich habe eine text Datei die viele zeilen enthällt. Hier bei handelt es sich um G-Code. Nun gibt es z.B. 100 Zeilen und in jeder Zeile stehen 20 Zeichen. In manchen der Zeilen ist unter den Zeichen die Reihenfolge "M3 S5". Diese möchte ich dann durch einen Text den ich festlegen kann in allen Zeilen ersetzten. Ich öffne die Textdatei und schreibe Sie mit FiletoArray in ein Array. Das bedeutet das jede Zeile meiner .txt nun in einem Array steht. Dieses bearbeite ich soweit. Nun muss ich noch die Zeichen in den Arrayzeilen ersetzten. Doch finde ich keinen befehl im Sinne von _ArrayTextFindAndReplace. Die Sache ist das ich zwar meine zeilen raussuchen kann, wenn ich weis wie die ganze zeile heißt, also der Inhalt vom Array, aber wenn es nur eine bestimmt Zeichenkette im Inhalt des Arrays ist, dann geht es nicht mit _arraySearch. Könnt Ihr mir helfen wie ich das anstellen kann ? Hier ein beispiel von vorher und nachher.

    Danke Tim

  • Sorry Beispiel vergessen ;)

    Vorher:

    Spoiler anzeigen

    G0 X3.0615 Y6.123
    G1 F400.0 Z-1.0
    G3 F800.0 X2.5195 Y6.1426 I-0.7582 J-13.5101
    G3 X1.715 Y6.0592 I-0.0441 J-3.4998
    G3 X1.3296 Y5.9258 I0.4397 J-1.8928
    G3 X0.9912 Y5.6982 I0.5634 J-1.2034
    G3 X0.6622 Y5.3451 I1.9924 J-2.1862
    G3 X0.4395 Y4.917 I0.8957 J-0.738
    G2 X0.3982 Y4.8293 I-0.1704 J0.0265
    G2 X0.3076 Y4.7949 I-0.0848 J0.087
    G2 X0.2197 Y4.8389 I0.0032 J0.1163
    G2 X0.2927 Y5.6277 I9.5495 J-0.4854
    G2 X0.4102 Y6.4111 I20.9173 J-2.7359
    G2 X0.708 Y6.416 I0.5728 J-25.8549
    G2 X1.7285 Y6.377 I-0.186 J-18.2095

    Nachher:

    Spoiler anzeigen

    G0 X3.0615 Y6.123
    G1 F400.0 M3 S500
    G3 F800.0 X2.5195 Y6.1426 I-0.7582 J-13.5101
    G3 X1.715 Y6.0592 I-0.0441 J-3.4998
    G3 X1.3296 Y5.9258 I0.4397 J-1.8928
    G3 X0.9912 Y5.6982 I0.5634 J-1.2034
    G3 X0.6622 Y5.3451 I1.9924 J-2.1862
    G3 X0.4395 Y4.917 I0.8957 J-0.738
    G2 X0.3982 Y4.8293 I-0.1704 J0.0265
    G2 X0.3076 Y4.7949 I-0.0848 J0.087
    G2 X0.2197 Y4.8389 I0.0032 J0.1163
    G2 X0.2927 Y5.6277 I9.5495 J-0.4854
    G2 X0.4102 Y6.4111 I20.9173 J-2.7359
    G2 X0.708 Y6.416 I0.5728 J-25.8549
    G2 X1.7285 Y6.377 I-0.186 J-18.2095

    Es geht halt noch einige Zeilen weiter, und es kommt immerwieder das Z-1.0 vor. Das immer die G1 F400.0 davor steht muss nicht immer so sein.

    Hier mein Aktueller Code:

    [autoit]

    #include <file.au3>
    #include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    Local $arraygcode
    Local $arrayco2aus
    Local $arrayco2ein = "G1 F400.0 Z-1.0"
    Local $co2aus = "M3 S0"
    Local $position = 2
    Local $counter = 0
    Local $co2ein = "M3 S5000"

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $gopen = FileOpenDialog("G-Code öffnen", @desktopdir,"G-Code(*.nc)")
    if @error = 1 then ;Datei öffnen
    msgbox(64,"Abbruch","Das Öffnen wurde durch den Benutzer "& @UserName & " " & " abgebrochen!")
    exit
    EndIf
    _FileReadToArray($gopen,$arraygcode)

    [/autoit][autoit][/autoit][autoit]

    $arrayco2aus = $arraygcode[5] ;Befehl für ausschalten herauslesen

    [/autoit][autoit][/autoit][autoit]

    _ArrayDelete($arraygcode,10) ;Überflüssige Zeile 10 löschen
    _ArrayInsert($arraygcode,10,"M8") ; ...und durch M8 ersetzten
    _ArrayDelete($arraygcode,5) ; Zeile 5 löschen

    [/autoit][autoit][/autoit][autoit]

    $position = _ArraySearch($arraygcode,$arrayco2ein) ;Zeile auslesen
    ConsoleWrite($position)

    [/autoit][autoit][/autoit][autoit]

    exit

    [/autoit][autoit][/autoit][autoit]

    while $position > 0 ;Ausschaltbefehle ersetzten

    $position = _ArraySearch($arraygcode,$arrayco2aus) ;Zeile auslesen

    [/autoit][autoit][/autoit][autoit]

    If $position > 0 then ;auf letzte Zeile abfragen
    $counter = $counter +1
    _ArrayDelete($arraygcode,$position)
    _ArrayInsert($arraygcode,$position,$co2aus)
    endif

    [/autoit][autoit][/autoit][autoit]

    ConsoleWrite($position)

    [/autoit][autoit][/autoit][autoit]

    WEnd
    MsgBox(64,"Co2 Auschalten","Es wurden " & $counter & " " & "Zeilen ersetzt.")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $position = _ArraySearch($arraygcode,"M5") ;M5 ersetzten
    If @error = 6 then
    msgbox(0,"Fehler","Die Zeile ""M5"" wurde nicht gefunden!")
    else
    _ArrayDelete($arraygcode,$position)
    _ArrayInsert($arraygcode,$position,"M9")
    EndIf

    [/autoit][autoit][/autoit][autoit]

    $position = _ArraySearch($arraygcode,"M30") ;M30 ersetzten
    If @error = 6 Then
    msgbox(0,"Fehler","Die Zeile ""G28"" wurde nicht gefunden!")
    else
    _ArrayDelete($arraygcode,$position)
    _ArrayInsert($arraygcode,$position,"G28")
    endif

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $gsave = FileSaveDialog("Datei speichern",@Desktopdir,"G-Code(*.nc)") ;Datei speichern
    if @error = 1 then
    msgbox(64,"Abbruch","Das Speichern wurde durch den Benutzer "& @UserName & " " & " abgebrochen!")
    SetError(9)
    else
    _FileWriteFromArray($gsave&".nc", $arraygcode,1)
    EndIf

    [/autoit][autoit][/autoit][autoit]

    if @error = 1 Then
    msgbox(16,"Fehler","Die Datei ist von einem anderen Program geöffnet!")
    elseif @error = 3 Then
    msgbox(16,"Fehler","Fehler beim Schreiben der Datei")
    elseif @error = 0 Then
    msgbox(64,"Abgeschlossen","Die Datei wurde erfolgreich geschrieben")
    EndIf

    [/autoit]
    • Offizieller Beitrag

    Ich meinte sowas hier

    Spoiler anzeigen
    [autoit]

    Global $InString = "Hallo dies ist ein toller Text!"
    Global $ersetzen_A[3][2] = [["i", "ü"],["a", "ä"],["o", "ö"]] ; [finden, ersetzen], ...
    ConsoleWrite($InString & @CRLF)
    For $i = 0 To UBound($ersetzen_A) - 1
    $InString = StringReplace($InString, $ersetzen_A[$i][0], $ersetzen_A[$i][1])
    Next
    ConsoleWrite('!' & $InString & @CRLF)

    [/autoit]
  • Wenn Du "nur" Zeichen ersetzen möchtest und das in der gesamten Datei, dann könnte _ReplaceStringInFile (siehe HilfeDatei zu den UDF) interessant sein.
    Hier brauchst Du die Datei nicht selbst öffnen, sondern übergibst einfach die Datei, Suchstring, ersetzstring.
    Ist ganz einfach.

    Hier ein Auszug aus der HilfeDatei:

    Spoiler anzeigen


    _ReplaceStringInFile
    Ersetzt in einer Textdatei einen String mit einem anderen String (binary funktioniert nicht!)
    #include <File.au3>
    _ReplaceStringInFile($szFileName, $szSearchString, $szReplaceString [, $fCaseness = 0 [, $fOccurance = 1]])
    Parameter
    $szFileName Name der zu öffnenden Datei. ACHTUNG !! Es wird der komplette Pfad benötigt, nicht nur der zurückgegebene Dateiname (wie z. B. bei FileFindNextFile)
    $szSearchString Der zu ersetzende String in der Datei
    $szReplaceString Der String, welchen man für $szSearchString einsetzen will
    $fCaseness [optional] 0 = Berücksichtigt die Groß- und Kleinschreibung nicht (Standard), 1 = Groß- und Kleinschreibung wird berücksichtigt, falls dies auftritt
    $fOccurance [optional] 0 = Nur die erste gefundene Stelle wird ersetzt, 1 = Alle Vorkommnisse werden ersetzt (Standard)
    Rückgabewert
    Erfolg: Gibt die Anzahl von Vorkommnissen von $szSearchString zurück
    Fehler: Gibt -1 zurück und setzt @error
    @error: 1 - Datei konnte nicht geöffnet werden
    2 - Temporäre Datei konnte nicht geöffnet werden
    3 - Temporäre Datei konnte nicht geschrieben werden
    4 - Originale Datei konnte nicht gelöscht werden
    5 - Temporäre Datei konnte nicht umbenannt/verschoben werden
    6 - Datei ist schreibgeschützt
    Bemerkungen
    Keine.
    Verwandte Funktionen
    Beispiel

    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $find = "VORHER"
    Local $replace = "NACHHER"

    [/autoit] [autoit][/autoit] [autoit]

    Local $filename = "C:\_ReplaceStringInFile.test"

    [/autoit] [autoit][/autoit] [autoit]

    Local $msg = "Hallo Test " & $find & " Hallo Test" & @CRLF
    $msg &= "Hallo Test" & @CRLF
    $msg &= @CRLF
    $msg &= $find

    [/autoit] [autoit][/autoit] [autoit]

    FileWrite($filename, $msg)

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, "VORHER", $msg)

    [/autoit] [autoit][/autoit] [autoit]

    Local $retval = _ReplaceStringInFile($filename, $find, $replace)
    If $retval = -1 Then
    MsgBox(0, "FEHLER", "Das Suchmuster konnte nicht Ersetzt werden!" & @CRLF & " & Datei: " & $filename & " Fehlercode: " & @error)
    Exit
    Else
    MsgBox(0, "INFO", $retval & " Übereinstimmungen mit dem Suchmuster: " & $find & " in der Datei: " & $filename & " gefunden.")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $msg = FileRead($filename, 1000)
    MsgBox(0, "NACHHER", $msg)
    FileDelete($filename)

    [/autoit]

    Alternativ siehe hier: http://www.autoitscript.com/autoit3/docs/l…tringInFile.htm