FileWrite zwischen 2 bestimmten Texten

  • hallo liebe Community.


    ich habe eine kleine Frage, die lautet wie folgt;

    Was für eine Methode muss ich benutzen um X zwischen 2 Texte in einer Datei schreiben zu lassen.
    ich schreibe einen Item Editor für ein Game um mir die Arbeit in zukunft zu erleichtern^^.
    Die zu bearbeitende Datei ist in Sektionen aufgeteilt es steht z.b

    "item" 4
    {
    ALLE ITEMEINTRÄGE HIER
    }
    "mvr" 5
    {
    ALLE MONSTEREINTRÄGE HIER
    }

    Ich möchte also dass er über dem } von "mvr" 5 oder unter dem { von "item" 4 Den Text X schreibt.

    Hoffe mir kann jemand helfen.
    Danke im Vorraus.
    MFG Kyu

  • Du könntest mit meiner Udf StringGetPos() (Link in meiner Signatur) die Postion von "item" 4 ermitteln, diese mit 2 addieren und dann mit _FileWriteToLine() den Text in die Zeile schreiben.
    Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    $x=StringGetPos("dateiname", '"item" 4')
    _FileWriteToLine("dateiname", $x+2, "Dein Text")

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: StringGetPos
    ; Description ...: Gibt die Zeile zurück, in der der String steht
    ; Syntax.........: StringGetPos($filename, $string)
    ; Parameters ....: $filename - Name der Datei
    ; $string - String, der gesucht werden soll
    ; Return values .: Erfolg - Gibt die Zeile zurück
    ; Fehler - Gibt 0 zurück
    ; @Error - 1 = String wurde nicht gefunden
    ; @Error - 2 = Datei existiert nicht
    ; Author ........: Ineluki
    ; Modified.......:
    ; Remarks .......:
    ; Related .......:
    ; Link ..........: https://autoit.de/index.php?page=Thread&threadID=21313
    ; Example .......: No
    ; ===============================================================================================================================
    Func StringGetPos($filename, $string)
    If Not FileExists($filename) Then
    SetError(2)
    Return
    EndIf
    For $line=0 to _FileCountLines($filename)
    If StringRegExp(FileReadLine($filename, $line), $string)=1 Then Return $line
    Next
    SetError(1)
    Return 0
    EndFunc

    [/autoit]
  • Vielen Dank, das wird mir noch sehr oft helfen :).
    Eine Frage noch, gibt es eine möglichkeit das zu beschleunigen denn auf die Art braucht er ne weile da Die MdlDyna.inc 35198 Zeilen hat^^

  • ja das ist mit RegExp möglich.

    Spoiler anzeigen
    [autoit]

    $sText = '"item" 4' & @CRLF & _
    '{' & @CRLF & _
    'ALLE ITEMEINTRÄGE HIER' & @CRLF & _
    '}' & @CRLF & _
    '"mvr" 5' & @CRLF & _
    '{' & @CRLF & _
    'ALLE MONSTEREINTRÄGE HIER' & @CRLF & _
    '}' & @CRLF

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

    Local $sSuche = '"item" 4', $sErsetzen = "Ich werde eingefügt" & @CRLF
    $sText = StringRegExpReplace($sText, '(\Q' & $sSuche & '\E\s+\{\s+)', "\1" & $sErsetzen)
    MsgBox(0, "", $sText)

    [/autoit]

    Wenn das so nicht nach deinen Wünschen ist, musst du's nochmal erklären :D

  • Zitat

    gibt es eine möglichkeit das zu beschleunigen denn auf die Art braucht er ne weile da Die MdlDyna.inc 35198 Zeilen hat


    Inelukis Version ist beim mehrfachen Eintragen nur deswegen so langsam, weil er permanent die Datei öffnet und schließt und jedes mal sämtliche Zeilen abklappert...
    Öffne deine Datei, schreibe alle Daten (Bsp. s. SeuBo) und dann schreib die Datei.

    Spoiler anzeigen
    [autoit]

    $dateiinhalt = '"item" 4' & @CRLF & _
    '{' & @CRLF & _
    'ALLE ITEMEINTRÄGE HIER' & @CRLF & _
    '}' & @CRLF & _
    '"mvr" 5' & @CRLF & _
    '{' & @CRLF & _
    'ALLE MONSTEREINTRÄGE HIER' & @CRLF & _
    '}' & @CRLF
    $a = FileWrite("test.txt", $dateiinhalt) ;datei zum Testen anlegen

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

    $hfile = FileOpen("test.txt", 1) ;datei zum schreiben öffnen
    $n = FileSetPos($hfile, 0, 0) ;filepointer setzen, so kann man auch im schreibmodus lesen

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

    $dateiinhalt = FileRead($hfile)

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

    ;for / to schleife alle items
    $item = ""
    For $i = 1 To 4
    $item &= "Itemeintrag Nr. " & $i & " eingefügt" & @CRLF
    Next

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

    $mvr = "}" & @CRLF & '"mvr"'
    $dateiinhalt = StringReplace($dateiinhalt, $mvr, $item & $mvr, 0, 1) ;casesensitiv ist wesentlich schneller

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

    FileWrite($hfile, $dateiinhalt)
    ;next
    FileClose($hfile)
    ShellExecuteWait("test.txt")
    FileDelete("test.txt") ;testdatei löschen

    [/autoit]
  • Wenn du FileWrite benutzt, brauchst du am besten

    [autoit]

    $hWnd = FileOpen($sDatei, 1) ;1 bedeutet: Schreibmodus (anhängend an das Dateiende) 2 bedeutet: Schreibmodus (löschen des vorherigen Inhaltes)
    FileWrite($hWnd, "Text")
    FileClose($hWnd)

    [/autoit]

    Das du die Datei im Schreibmodus öffnest ist SEHR wichtig. Du kannst im Schreibmodus 130.000 Zeilen in 3 Sekunden schreiben. Wenn du nur FileOpen($sDatei) hast, ohne 1 oder 2, dann öffnet er das File im Lesemodus - wo du auch schreiben kannst, aber 130.000 Zeilen in ca. 3 Minuten.

    Also um den Vorgang zu verschnellern im Schreibmodus öffnen nicht vergessen!

  • @Burak
    mit setzen des Filepointers kann man auch im Schreibmodus lesen, s. Skript oben.
    Das mit der Geschwindigkeit hattest du ja erwähnt....

  • B


    1.Er soll den String net ersetzen sondern 2 Zeilen unter dem String was schreiben
    2.Woher soll das Programm bei deiner Methode wissen welche Datei bearbeitet wird? o:

  • 1.Er soll den String net ersetzen sondern 2 Zeilen unter dem String was schreiben
    2.Woher soll das Programm bei deiner Methode wissen welche Datei bearbeitet wird? o:


    1. Hast du mein Script überhaupt gestartet?
    Hättest du dir das Ergebnis genau angeschaut, dann hättest du gesehen dass es genau das macht. Suchen & ersetzen waren nur unglückliche Variablenbenennungen, hatte ne lange nacht...

    2. Da es ein Beispiel ist, hab ich den Text halt direkt ins Script geschrieben. einfach durch FileRead ersetzen....

  • SEuBo,
    du erwarest definitiv zu viel...jetzt sollen die Leute auch noch kapieren was ihnen hier in den Hintern geblasen wird...unverschämt von dir!
    Und auch noch selbstständig eine Zeile des Scripts tauschen...wo kommen wir denn da hin, wenn das jeder hier so machen würde?
    *Ironiemodus OFF*

    Nach den gelesenen Kommentaren zu den in den letzten Tagen geposteten Lösungen hab ich mich entschlossen, vorerst irgendwelchen "Neulingen" garnicht mehr zu Antworten. Solltest du auch machen, dann hast du mehr Zeit zu schlafen ;)

  • SEuBo,
    du erwarest definitiv zu viel...jetzt sollen die Leute auch noch kapieren was ihnen hier in den Hintern geblasen wird...unverschämt von dir!
    Und auch noch selbstständig eine Zeile des Scripts tauschen...wo kommen wir denn da hin, wenn das jeder hier so machen würde?
    *Ironiemodus OFF*

    Nach den gelesenen Kommentaren zu den in den letzten Tagen geposteten Lösungen hab ich mich entschlossen, vorerst irgendwelchen "Neulingen" garnicht mehr zu Antworten. Solltest du auch machen, dann hast du mehr Zeit zu schlafen ;)


    Danke für deine extrem soziale Einstellung ;).
    Keiner zwingt dich irgendwem zu helfen ich hab mir 2 Wochen ohne Internet selbst auto it begebrach, tut mir Leid wenn es nicht deinen Erwartungen entspricht dass ich nicht alle Befehle kenne und alles verstehe woher soll ich wissen wo dort definiert wird welche Datei benutzt wird wenn auch in den Hilfsdatein davon nichts steht, und ja ich habe das Script ausgeführt und es hat nur $text in einer MsgBox ausgegeben und nichts eingetragen da Mdldyna.inc nirgendswo definiert wurde also wie kann ich dann testen ob das script ersetzt oder neu einträgt ~.~

  • Also nochmal.
    Ich hatte nur den Textausschnitt den du gepostet hast. Damit man das Beispielscript testen kann, hab ich einfach statt einem FileRead den Textausschnitt eingefügt. Und statt FileWrite eine MsgBox.

    Ich gehe generell davon aus, dass man genügend Eigeninitiative besitzt, um (vor allem wenn du dich ja scheinbar mit der Hilfedatei auskennst) so einfache Befehle wie FileWrite und FileRead zu finden, und in der Lage ist diese Befehle auch umzusetzen. Selbst wenn deine Versuche dann nicht klappen - versuchs erstmal selber und poste deine Versuche hier. Das zeigt wenigstens deine Motivation.

    Jetzt startest du bitte nochmal das script von mir und schaust ob der Teil, der eingefügt werden soll, an der richtigen Stelle ist (!!!!) (in der MsgBox)


    Andy: Das ist scheinbar eine Krankheit von mir. Ich komm einfach nicht drumherum zu antworten.
    Es ist einfach immer schön geholfen zu haben. Nur manchmal sorgt es für mehr Stress & erhöhten Blutdruck als mir lieb ist.

    @Kyu
    [autoit]

    $sPfad = "HIER DIE DATEI.TXT"
    $sText = FileRead($sPfad)

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

    Local $sSuche = '"item" 4', $sErsetzen = "Ich werde eingefügt" & @CRLF
    $sText = StringRegExpReplace($sText, '(\Q' & $sSuche & '\E\s+\{\s+)', "\1" & $sErsetzen)

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

    ;~ MsgBox(0, "", $sText)
    FileDelete($sPfad)
    FileWrite($sPfad,$sText)

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Danke das funktioniert und dauert auch nur 1-2 Sekunden.
    Tut mir Leid dass ich nicht selbst drauf gekommen bin aber ich hab das Script nicht ganz nachvollziehen können ._.