Alle gleichen Strings in Datei1 mit einem String aus Datei2 ersetzen?

  • kurzes Beispiel:
    Text in Datei 1, siehe Bild::
    Sorry, aber ich kann den Text weder als Code, Zitat oder sonstwas einfügen...Der Editor verwurstet dann alles..WARUM?
    Dann sollen ALLE Strings Fid=abcdefghjkll aus Datei1 mit z.B.:Fid=xyzqwertz aus Datei 2 ersetzt werden.
    Die Strings finde und lese ich aus, mit z.B. mit folgender Regular Expression:

    [autoit]

    $sRead = FileRead($sFilein) ;Datei2 c:\new.txt
    Sleep(3000)
    $array = StringRegExp($sRead, 'Fid=[^&]*', 3)
    _ArrayDisplay($array)
    _FileWriteFromArray($sFileout, $array) ; Erstellt neue Datei $fileout und schreibt die gefundenen Strings hinein

    [/autoit]


    Jetzt fehlt nur noch der Teil mit dem ersetzen.. :whistling:

  • [autoit]


    $sString1 = "bdfjbjbd/sdkjshfn?Fid=abcdefghjkll" & @CRLF & _
    "bdfjbaweetkd/?Fid=abcdefghjkll" & @CRLF & _
    "bdfjbjbsdsd/shfn?Fid=abcdefghjkll" & @CRLF & _
    "bdfjbjbd/sdssdsdd?Fid=abcdefghjkll" & @CRLF & _
    "bdfjbjbd/sweshfn?Fid=abcdefghjkll"
    $sString2 = "Fid=xyzqwertz"

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

    $sString1 = StringRegExpReplace($sString1, 'Fid=abcdefghjkll', $sString2)
    MsgBox(0,0,$sString1)

    [/autoit]
  • Das funktioniert so nicht, da sich die Strings öfter ändern...
    Es ist also nicht möglich, mit "festen Werten" zu arbeiten.
    Es müsste quasi so laufen:
    1. finde zuerst den neuen String mittels StringRegExp "Fid=[^&]*" in Datei 2
    2. ersetze alle mittels StringRegExp "Fid=[^&]*" gefundenen Strings in Datei1, mit dem vorher gefundenen, aus Datei2
    Die Strings in Datei1, die ersetzt werden sollen, sind alle gleich, haben aber keinen "festen Wert", sondern ändern sich.

  • Die Strings sind alle gleiche, haben aber keinen festen Wert? Ich versteh nur Bahnhof.
    Ein kleines Beispiel wie die Dateien aussehen wäre hilfreich gewesen. AUf deinem Screenshot
    ist es immer der selbe String.

    Spoiler anzeigen
    [autoit]


    $sString1 = "bdfjbjbd/sdkjshfn?Fid=abcdefghjkll&sdsd" & @CRLF & _
    "bdfjbaweetkd/?Fid=abcdefghjkll&sdsdsd" & @CRLF & _
    "bdfjbjbsdsd/shfn?Fid=abcdefghjkll&ewewe" & @CRLF & _
    "bdfjbjbd/sdssdsdd?Fid=abcdefghjkll&wewwew" & @CRLF & _
    "bdfjbjbd/sweshfn?Fid=abcdefghjkll&kwkekrkr"
    $sString2 = "Fid=xyzqwertz"

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

    $sString1 = StringRegExpReplace($sString1, '(Fid=.*\&)', $sString2)
    MsgBox(0,0,$sString1)

    [/autoit]
  • Die Strings sind alle gleiche, haben aber keinen festen Wert? Ich versteh nur Bahnhof.
    Ein kleines Beispiel wie die Dateien aussehen wäre hilfreich gewesen. AUf deinem Screenshot
    ist es immer der selbe String.

    Hab mich vielleicht ein bischen unglücklich ausgedrückt..
    Es ist eine Datei mit 20 html Links. Der Rest um die Strings ist halt unterschiedlich, wird aber auch nicht geändert

    Code
    http://homepage.com/test&ticket%5Fid=abcdefghij&f=1304558530171&channel=1
    http://homepage.com/test&ticket%5Fid=abcdefghij&f=1304558559617&channel=2
    http://homepage.com/test&ticket%5Fid=abcdefghij&f=1304558574046&channel=3
    http://homepage.com/test&ticket%5Fid=abcdefghij&f=1304558588829&channel=5
    .............................


    1. ALLE 20 zu ersetzenden Strings sind generell immer gleich. in diesem Beispiel halt. "abcdefghij"
    d.h. die zu ersetzenden Strings sind immer alle "Fid=abcde" oder "Fid=12345" oder "Fid=wasauchimmer".
    ABER diese (alle) Strings ändern sich halt. Spätestens beim ersetzen.
    Ich kann also nicht generell sagen: ersetze Fid=abcde mit Fid=12345, sondern beide Werte müssen zuerst gefunden werden!
    Das finden und auch anzeigen der Strings mittels "StringRegExp" ist kein Problem, aber das ersetzen.

    3 Mal editiert, zuletzt von vel2000 (6. Mai 2011 um 07:08)

  • Irgendwie verstehe ich nicht wo dein Problem noch ist.
    Die beiden zu ersetzenden Strings hast du ja und musst sie eigentlich nur noch in ein StringReplace einbauen und dann in die Datei schreiben.
    Aber da ich auch des öfteren mal nen Knoten im Hirn hab hier mal mein Vorschlag das zu lösen:

    Spoiler anzeigen
    [autoit]

    Global $s_Pattern= '(Fid=.+?)&'

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

    Global $s_File1 = FileRead("Datei1.txt")
    Global $s_File2 = FileRead("Datei2.txt")

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

    Global $a_Fid1 = StringRegExp($s_File1, $s_Pattern, 1)
    Global $a_Fid2 = StringRegExp($s_File2, $s_Pattern, 1)

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

    ; Testausgabe ob auch alles noch stimmt:
    MsgBox(0,"Funde", "Datei 1: " & $a_Fid1[0] & @CRLF & "Datei 2: " & $a_Fid2[0])

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

    Global $h_Datei1 = FileOpen("Datei1.txt", 2) ; Datei löschen und zum Schreiben öffnen
    FileWrite($h_Datei1, StringReplace($s_File1, $a_Fid1[0], $a_Fid2[0]))
    FileClose($h_Datei1)

    [/autoit]
  • Zitat

    Irgendwie verstehe ich nicht wo dein Problem noch ist.
    Die beiden zu ersetzenden Strings hast du ja und musst sie eigentlich nur noch in ein StringReplace einbauen und dann in die Datei schreiben.
    Aber da ich auch des öfteren mal nen Knoten im Hirn hab hier mal mein Vorschlag das zu lösen:

    SUPER, das funktioniert. Vielen Dank. :thumbup:
    Und naja, die Strings hatte ich schon....aber das ganze so zusammen zu bauen, daran hats gehapert :wacko: