Nochmals zu StringReplace

  • Unter
    [ offen ] Funktion StringReplace ist schrecklich langsam
    hatte ich gefragt:

    Funktion StringReplace ist schrecklich langsam
    Ich habe einen String ($feld), der 24 MByte lang ist.
    In diesen möchte ich tausende kleine Strings einfügen (überschreiben). Da aber mit der Funktion StringReplace jedes Mal der gesamte String $feld umgespeichert wird, dauert der Prozess ewig lange. Das Umspeichern ist gar nicht notwendig, da $feld sich ja in seiner Länge nicht ändert.
    Gibt es eine Möglichkeit, die kleinen Strings an Ort und Stelle einzufügen, ohne dass $feld umgespeichet wird?


    chesstiger hatte so geantwortet:

    Hier wäre es wohl am einfachsten, wenn du auf eine C/C++-Dll zurückgreifst. Da solltest du den String bequem einzeln auseinander nehmen können

    Meine Frage ist nun:

    Weiß jemand, wo ich eine solche DLL finde?
    Vielen Dank schon mal im Voraus!

  • Kann sein, dass ich es missverstanden habe, aber bei mir werden in 26 MB Daten über eine Million Ersetzungen getätigt in 200millisekunden

    Spoiler anzeigen
    [autoit]

    $string="Alle Vögel sind schon da!"
    for $i=1 to 20
    $string &=$string
    Next
    $stringlen=stringlen($string) ;~26MB
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $stringlen = ' & $stringlen & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    $t=timerinit()
    $ersetzt=stringreplace($string,"Vögel","Rehe",0,1)
    $anzahl=@extended
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $anzahl = ' & $anzahl & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    $m=timerdiff($t)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $m & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit]
  • Vielen Dank Andy für Deine Antwort und die Mühe ! ! !.

    Ich möchte nicht nach Zeichen suchen und diese dann ersetzen, sondern gezielt Zeichen an einer bestimmten Position einsetzen.

    Ich muss also im Parameter "searchstring/start" nicht searchstring sondern start verwenden.

    StringReplace ( "string", "searchstring/start", "replacestring" [, occurrence [, casesense]] )