txt umschreiben via StringRegExpReplace - ok , aber wie geht das mit externen Variablen???

  • Moin moin,
    ich hoffe, mir kann geholfen werden (bin noch nicht so autoit erfahren) ;)
    Ich quäle mich mit dem Umsetzen von Dateien. Bspw. um Koordinaten umzustellen usw. .
    Zu mir: GUI hab ich für einiges inzwischen, Umsetzungen via StringRegExpReplace bekomm ich hin ...
    Ich lese quasi eine Datei ein und schreibe sie in eine andere um.
    Und jetzt kommt der Haken:
    Ich möchte an bestimmten Stellen in der neuen Datei Bemerkungen einfügen. Diese Bemerkungen soll mein Script aus vorherigen Eingaben (Variable in einer InputBox) übernehmen.

    Variablen dim & Inputbox kriege ich hin. Den StringRegExpReplace inc. Dateischreibere auch (da habt ihr mir hier damals schon sehr geholfen).
    Aber mir scheint es so, als ob er bei StringRegExpReplace keine "externen" Variablen im gegensatz zu festen Textpassagen einfügen kann ?
    Wie kann ich das lösen ?

    Beispiel (Auszug aus meinem Script):

    [autoit]

    Case $msg = $al ;~ Ereignis 21, der Knopf wird gedrückt
    $sFilename = FileOpenDialog('Bitte Textdatei zum konvertieren auswählen', @ScriptDir, 'Text (*.pkt)', 1) ; Dialogbox zum auswählen der Datei
    If @error Then Exit ; wenn der Benutzer auf 'abbrechen' geklickt hat, dann Script beenden
    $sText = FileRead($sFilename) ; Datei einlesen
    $sText = StringRegExpReplace($sText, '(.{3}) (.{4}) (.{5})', 'aaa $3 $2 $1 bbb') ; die Formatierung ändern
    $sNewFilename = StringRegExpReplace($sFilename, '(.+)\.*', '$1.al') ; Neuen Dateinamen generieren
    $hFile = FileOpen($sNewFilename, 2) ; Datei zum schreiben öffnen
    If $hFile <> -1 Then ; wenn erfolgreich, dann...
    FileWrite($hFile, $sText) ; neuen Text schreiben
    FileClose($hFile) ; Datei schließen
    EndIf

    [/autoit]

    So in etwa sieht das Replace aus. Klappt alles. "aaa" und "bbb" als einfache zu übernehmenden feste Werte auch.
    Ich möchte aber hier eine vorher abgefragte Variable einfügen.
    Bspw. stecke ich ein "xyz" via Inputbox vorher in die Variable $test. Und anstelle des "aaa" möchte ich an dieser Stelle den Wert aus $test, sodass am Ende in der Zieldatei nicht "aaa" steht sondern das vorher abgefragte "xyz".

    Ich sitz da jetzt schon viele Stunden drann aber finde keine Lösung. Setze ich bspw. $test ein (wie im Beispiel auch die aus der Datei $3) schreibt er mir "$test" in die Ausgabedatei, nicht den Inhalt der Variablen.
    Ich vermute inzwischen, dass das nur mit StringRegExpReplace gar nicht möglich ist ?

    Einmal editiert, zuletzt von sanni74 (6. November 2014 um 01:37)

  • Hey
    Wenn ich das jetzt richtig erkannt hab, hast du die Variablen mit in die " " gepackt. Nur reiner Text wird in " " geschrieben. Variablen werden immer mit

    [autoit]

    ("Nur Text" & $variable)

    [/autoit]

    eingefügt. Probier es mal mit:

    [autoit]

    $sText = StringRegExpReplace($sText, '(.{3}) (.{4}) (.{5})', 'aaa' & $3 & $2 & $1 & 'bbb') ; die Formatierung ändern

    [/autoit]

    Hab auch mal ein kleines Beispiel zur Veranschaulichung erstellt:

    [autoit]

    $text = "Dein Text aaa" ;Text oder Txt Datei
    $input = InputBox("", "Text zum ersetzen eingeben") ;Inputbox zum eingeben womit "aaa" ersetzt werden soll
    $replace = StringRegExpReplace($text, "aaa", "ist " & $input) ;Hier wird jetzt "Dein Text aaa" mit "Dein Text ist" und dem vorher eingegebenem Text ersetzt
    MsgBox(0, "", $replace) ;Neuen Text anzeigen

    [/autoit]

    Ich hoffe ich es hab halbwegs verständlich ausgedrückt :)

    Einmal editiert, zuletzt von timee000 (6. November 2014 um 02:50)

  • Danke dir!
    So wie ichs jetzt sehe, kann ich im ersten replace (reiner Textumbau) keine Variablen einfügen.
    Daher lass ich das replace 2 mal laufen.
    Im ersten Ansatz bau ich die Texte um, im 2. ersetze ich (wie von dir gezeigt) bestimmte Passagen durch Variablen.
    Der Test im Kleinen hat geklappt. Ich schreib mal weiter ...

    Habs mit mehreren replace hinbekommen. Läuft :)
    Danke nochmal, ich machs zu

    2 Mal editiert, zuletzt von sanni74 (6. November 2014 um 15:43)

  • Hey
    Wenn ich das jetzt richtig erkannt hab, hast du die Variablen mit in die " " gepackt. Nur reiner Text wird in " " geschrieben. Variablen werden immer mit

    [autoit]

    ("Nur Text" & $variable)

    [/autoit]

    eingefügt. Probier es mal mit:

    Hast du nicht richtig erkannt! Das was er als "$3 $2 $1"in den Anführungszeichen hat sind keine eigenen Variablen, sondern Backreferences auf die Teiltreffer des RegExp Pattern, also mehr oder weniger temporäre Variablen die die RegExp Funktion verwendet um seine Zwischenergebnisse zu speichern. Durch ansprechen dieser Zwischenergebnisse wird der String umsortiert. Das ist so syntaktisch jedenfalls korrekt und auch beabsichtigt.

    Das was er durch eine Variable ersetzen wollte sind die Stringteile "aaa" und "bbb".


    So wie ichs jetzt sehe, kann ich im ersten replace (reiner Textumbau) keine Variablen einfügen.

    Bezweifle ich. Ich verwende zwar normalerweise keine RegExp Funktionen aber so sollte das auch in einem Rutsch funktionieren:

    [autoit]

    $sText = StringRegExpReplace($sText, '(.{3}) (.{4}) (.{5})', $deineVariable & ' $3 $2 $1 konstanter_Text_der_angehängt_werden_soll ' $weitereVariable) ; die Formatierung ändern

    [/autoit]

    3 Mal editiert, zuletzt von misterspeed (8. November 2014 um 13:11)