Textdateien oder solche die Text enthalten, nach Werten durchsuchen und durch andere Werte ersetzen..

  • Hallöchen,

    selbst auf die Gefahr hin das ich gleich was auf den Deckel bekomme, im Sinne von: Guck doch Mal in die Hilfe, oder nutz`die Forensuche.... Hab ich, nur werd ich da nicht schlau draus...
    Jaaa ich brauch immer etwas länger :D

    Ein Bekannter von mir hatte ein Mal in Delphi eine Exe-Datei erstellt mit der er Textdateien nach Inhalten durchsuchen konnte und diese dann durch neue Inhalte in einer neuen Datei gespeichert hat...
    So etwas versuche ich gerade nachzubauen und hänge an dem Punkt fest, wo die Datei geöfnet / ausgelesen werden soll...

    Ich habe eine kleine GUI erstellt wo ich zumindest schon Mal so weit bin das ich den Pfad zu der zu ändernden Datei öffnen kann und der Pfad der "Neuen" Datei eingetragen werden kann... dieser wird auch schon Mal übernommen, doch da verliessen sie mich....

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 459, 150, 193, 125)
    $IN_FILE = GUICtrlCreateLabel("In File", 16, 16, 32, 17)
    $OUT_FILE = GUICtrlCreateLabel("Out File", 16, 48, 40, 17)
    $Button_IN = GUICtrlCreateButton("...", 56, 12, 27, 25, 0)
    $Button_OUT = GUICtrlCreateButton("...", 56, 44, 27, 25, 0)
    $FILE_TO_CHANGE = GUICtrlCreateInput("", 98, 14, 345, 21) ; Pfad zur Datei derer Inhalt angepasst werden soll
    $CHANGED_FILE = GUICtrlCreateInput("", 98, 46, 345, 21) ; Pfad zur angepassten Datei
    $Checkbox1 = GUICtrlCreateCheckbox("Case sensitive", 16, 120, 97, 17) ; Funktion check ich noch net :D
    $Label1 = GUICtrlCreateLabel("Old Pattern:", 16, 80, 60, 17)
    $OLD_PATTERN = GUICtrlCreateInput("", 98, 78, 121, 21)
    $Label2 = GUICtrlCreateLabel("New Pattern:", 232, 80, 66, 17)
    $NEW_PATTERN = GUICtrlCreateInput("", 322, 78, 121, 21)
    $Button3 = GUICtrlCreateButton("Start", 368, 116, 75, 25, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button_IN
    $IN_Path = FileOpenDialog("title",@WorkingDir & "\","Textfiles (*.txt;*.ini;*.html;*.au3;*.doc;*.log)")
    GUICtrlSetData($FILE_TO_CHANGE,$IN_Path)

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

    Case $Button_OUT
    $OUT_Path = FileOpenDialog("title",@WorkingDir & "\","Textfiles (*.txt;*.ini;*.html;*.au3;*.doc;*.log)")
    GUICtrlSetData($CHANGED_FILE,$OUT_Path)

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

    ; Nun wird der OUT_Path erst noch bearbeitet

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

    Case $Button3
    $Old_P = GUICtrlRead($OLD_PATTERN) ; lesen: zu ersetzendes Zeichen
    $New_P = GUICtrlRead($NEW_PATTERN) ; lesen: Ersatzzeichen
    $Origin = GUICtrlRead($IN_Path) ; lesen: Pfad der Orginaldatei
    $New_Path = GUICtrlRead($CHANGED_FILE) ; lesen: Pfad der neuen Datei

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

    ;MsgBox(0,"","Outpath =" & $New_Path)

    EndSwitch
    WEnd

    [/autoit]


    Frage: Wie genau bekomme ich es hin, das eine Datei nach z.B. "X" durchsucht wird und alle "X" durch "A" ersetzt ?
    Würd mir schon reichen wenn mir wer die Funktionalität ein wenig näher bringen könnte.
    FileOpen, FileRead & FileWrite habe ich mir schon angeshen, auch StringReplace habe ich mir lange angeschaut, nur der Knoten will nicht platzen ( Weiss nicht wie ich`s umsetzen kann )
    Nicht falsch verstehen bitte, ich will keine fertigen Scripte vor die Nase gehalten bekommen, mags nur endlich schnallen :D

    Grüße

    Mike

    Einmal editiert, zuletzt von Mike280399 (7. Oktober 2011 um 18:28)

  • Ich hoffe die Kommentare sind dir Erklärung genug. Und sonst sagst dus einfach.

    Spoiler anzeigen
    [autoit]

    $hOld = FileOpen($Origin, 0) ; So öffnest du das alte File,
    $hNew = FileOpen($New_Path, 2) ; und das neue File. Mit dem Flag = 0 öffnest du es zum lesen und
    ; mit dem Flag = 2 öffnsest du es zum schreiben und löschst den vorherigen Inhalt

    $sOld = FileRead($hOld) ; Hier liest du das alte File komplett ein
    $sNew = StringReplace($sOld, $Old_P, $New_P) ; Um dann hier den Inhalt des Files zu prüfen und $Old_P durch $New_P zu ersetzen
    FileWrite($hNew, $sNew) ; Nach dem ersetzen schreibst du den erhaltenen Text in das neue File

    FileClose($hOld) ; Zum schluss die Files wider schliessen
    FileClose($hNew)

    MsgBox(0, "Fertig!", "Vorgang abgeschlossen!") ; Und vielleicht noch mitteilen, dass du Fertig bist. z.B. so.

    [/autoit]


    Gruss Shadowigor

  • Huhu und danke für die Schnelle Antwort !

    Das sieht alles ziemlich schlüssig aus, nur eines schnall ich nicht...
    Ich habe mich gewundert das die neue Textdatei komplett leer ist und hab mir dan durch eine MsgBox Mal $hOld ausgeben lassen:

    [autoit]

    $sOld = FileRead($hOld)
    MsgBox(0, "", $hOld)

    [/autoit]


    Da stand nur -1 drin ?(

    'EDIT: Wenn ich mir $sOld ausgeben lasse ist die MsgBox leer

    Einmal editiert, zuletzt von Mike280399 (7. Oktober 2011 um 16:53)

  • Ok, das heisst, dass er das File nicht öffnen kann. Ich vermute, dass das File gar nicht existiert. Überprüfe nochmal den Pfad den du eingegeben hast. Falls der definitiv stimmt, liegt es vielleicht daran:
    Zitat aus der Hilfe:
    "Das Öffnen einer Datei kann möglicherweise fehlschlagen, durch fehlende Zugriffsrechte oder Attribute."
    Das solltest du auch noch überprüfen. Sonst weis ich auch gerade nicht mehr weiter.

    • Offizieller Beitrag
    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    #region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 459, 150, 193, 125)
    $IN_FILE = GUICtrlCreateLabel("In File", 16, 16, 32, 17)
    $OUT_FILE = GUICtrlCreateLabel("Out File", 16, 48, 40, 17)
    $Button_IN = GUICtrlCreateButton("...", 56, 12, 27, 25, 0)
    $Button_OUT = GUICtrlCreateButton("...", 56, 44, 27, 25, 0)
    $FILE_TO_CHANGE = GUICtrlCreateInput("", 98, 14, 345, 21) ; Pfad zur Datei derer Inhalt angepasst werden soll
    $CHANGED_FILE = GUICtrlCreateInput("", 98, 46, 345, 21) ; Pfad zur angepassten Datei
    $Checkbox1 = GUICtrlCreateCheckbox("Case sensitive", 16, 120, 97, 17) ; Funktion check ich noch net :D
    $Label1 = GUICtrlCreateLabel("Old Pattern:", 16, 80, 60, 17)
    $OLD_PATTERN = GUICtrlCreateInput("", 98, 78, 121, 21)
    $Label2 = GUICtrlCreateLabel("New Pattern:", 232, 80, 66, 17)
    $NEW_PATTERN = GUICtrlCreateInput("", 322, 78, 121, 21)
    $Button3 = GUICtrlCreateButton("Start", 368, 116, 75, 25, 0)
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button_IN
    $IN_Path = FileOpenDialog("title", @WorkingDir & "\", "Textfiles (*.txt;*.ini;*.html;*.au3;*.doc;*.log)")
    GUICtrlSetData($FILE_TO_CHANGE, $IN_Path)

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

    Case $Button_OUT
    $OUT_Path = FileOpenDialog("title", @WorkingDir & "\", "Textfiles (*.txt;*.ini;*.html;*.au3;*.doc;*.log)")
    GUICtrlSetData($CHANGED_FILE, $OUT_Path)

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

    ; Nun wird der OUT_Path erst noch bearbeitet

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

    Case $Button3
    $Old_P = GUICtrlRead($OLD_PATTERN) ; lesen: zu ersetzendes Zeichen
    $New_P = GUICtrlRead($NEW_PATTERN) ; lesen: Ersatzzeichen
    $Origin = GUICtrlRead($FILE_TO_CHANGE) ; lesen: Pfad der Orginaldatei
    $New_Path = GUICtrlRead($CHANGED_FILE) ; lesen: Pfad der neuen Datei
    _replace($Origin, $New_Path, $Old_P, $New_P)
    ConsoleWrite($Origin & @CRLF & $New_Path & @CRLF & $Old_P & @CRLF & $New_P)

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

    ;MsgBox(0,"","Outpath =" & $New_Path)

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

    EndSwitch
    WEnd

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

    Func _replace($org, $new, $before, $after)
    $hOld = FileOpen($org, 0) ; So öffnest du das alte File,
    $hNew = FileOpen($new, 2) ; und das neue File. Mit dem Flag = 0 öffnest du es zum lesen und
    ; mit dem Flag = 2 öffnsest du es zum schreiben und löschst den vorherigen Inhalt
    $sOld = FileRead($hOld) ; Hier liest du das alte File komplett ein
    $sNew = StringReplace($sOld, $before, $after) ; Um dann hier den Inhalt des Files zu prüfen und $Old_P durch $New_P zu ersetzen
    MsgBox(64, 0, @extended & ' mal gefunden')
    FileWrite($hNew, $sNew) ; Nach dem ersetzen schreibst du den erhaltenen Text in das neue File
    FileClose($hOld) ; Zum schluss die Files wider schliessen
    FileClose($hNew)
    EndFunc ;==>_replace

    [/autoit]
  • Nö...

    Habs nu mit

    [autoit]

    If Not _FileReadToArray($IN_Path, $aRecords) Then
    MsgBox(4096, "Fehler", "Fehler beim Einlesen der Datei in das Array!" & @CRLF & "Fehlercode: " & @error)
    Exit
    EndIf

    _FileWriteFromArray($New_Path, $aRecords)

    [/autoit]


    so weit hinbekommen das zumindest die Alte datei ausgelesen und die neue ( derzeit noch mit gleichem Inhalt ) erstellt wird...
    Nun fehlts nur noch am Ersetzen der Zeichen....
    Was mir jetzt noch auffällt, ist das in der neuen Datei eine "8" vorne an steht 8|

    Hier Mal die Eingabedatei Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.
    Soll dann unter anderem Namen mit xxxxxx statt ffffff gespeichert werden...

  • Versuchs mal so:

    Spoiler anzeigen
    [autoit]

    $aTxt = _FileReadToArray($IN_Path, $aRecords)

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

    If Not $sTxt Then
    MsgBox(4096, "Fehler", "Fehler beim Einlesen der Datei in das Array!" & @CRLF & "Fehlercode: " & @error)
    Exit
    EndIf

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

    For $i = 1 To $aTxt[0] - 1
    $aTxt[$i] = StringReplace($aTxt[$i], $Old_P, $New_P)
    Next

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

    _FileWriteFromArray($New_Path, $aRecords, 1)

    [/autoit]


    Ist halt etwas umständlich aber wenns nur so funktioniert...

    Und das mit der 8 am anfang ist, weil _FileReadToArray im ersten Element die Anzahl der eingelesenen Zeilen hat. Und die hast du dann auch noch reingeschrieben.

  • Tadaaa :D

    funzt nun so:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <file.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 459, 150, 193, 125)
    $IN_FILE = GUICtrlCreateLabel("In File", 16, 16, 32, 17)
    $OUT_FILE = GUICtrlCreateLabel("Out File", 16, 48, 40, 17)
    $Button_IN = GUICtrlCreateButton("...", 56, 12, 27, 25, 0)
    $Button_OUT = GUICtrlCreateButton("...", 56, 44, 27, 25, 0)
    $FILE_TO_CHANGE = GUICtrlCreateInput("", 98, 14, 345, 21) ; Pfad zur Datei derer Inhalt angepasst werden soll
    $CHANGED_FILE = GUICtrlCreateInput("", 98, 46, 345, 21) ; Pfad zur angepassten Datei
    $Checkbox1 = GUICtrlCreateCheckbox("Case sensitive", 16, 120, 97, 17) ; Funktion check ich noch net :D
    $Label1 = GUICtrlCreateLabel("Old Pattern:", 16, 80, 60, 17)
    $OLD_PATTERN = GUICtrlCreateInput("", 98, 78, 121, 21)
    $Label2 = GUICtrlCreateLabel("New Pattern:", 232, 80, 66, 17)
    $NEW_PATTERN = GUICtrlCreateInput("", 322, 78, 121, 21)
    $Button3 = GUICtrlCreateButton("Start", 368, 116, 75, 25, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    Dim $aRecords

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button_IN
    $IN_Path = FileOpenDialog("title",@WorkingDir & "\","Textfiles (*.txt;*.ini;*.html;*.au3;*.doc;*.log)")
    GUICtrlSetData($FILE_TO_CHANGE,$IN_Path)

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

    Case $Button_OUT
    $OUT_Path = FileOpenDialog("title",@WorkingDir & "\","Textfiles (*.txt;*.ini;*.html;*.au3;*.doc;*.log)")
    GUICtrlSetData($CHANGED_FILE,$OUT_Path)
    Case $Button3
    $Old_P = GUICtrlRead($OLD_PATTERN)
    $New_P = GUICtrlRead($NEW_PATTERN)
    $New_Path = GUICtrlRead($CHANGED_FILE)
    $hOld = FileOpen($IN_Path, 0)
    $hNew = FileOpen($New_Path, 2)
    $sOld = FileRead($hOld)
    $sNew = StringReplace($sOld, $Old_P, $New_P) ;
    FileWrite($hNew, $sNew)
    FileClose($hOld)
    FileClose($hNew)
    MsgBox(64, "Fertig!", "Inhalte ( " & $Old_P & " ) in ( " & $New_P & " ) geändert! ")
    EndSwitch
    WEnd

    [/autoit]

    Muss nu nur noch das mit dem Case-Sensitive hinbekommen.... :wacko:
    Aber das wird schon noch :D

    Vielen Dank euch :thumbup: