Textdatei in einer bestimmtenzeile ein Text ändern ohne das ein anderes aus einer anderen Zeile mit überschrieben wird.

  • Hallo Alle Zusammen!

    Forhes fest an alle erst mal.

    Habe folgenes Problem Ich habe eine Textdatei erstellt wo Paar Wörter in Zeilen Stehen, wenn ich z.B. die Dritte Zeile ein Text ändern möchte der Länger als das derzeitige Wort ist dann tut der Skript die Nachbarzeile mit überschreiben.

    Das Heisst wenn z.B. zeile 3 Hello Steht sind 5 Buchstaben und ich Schreibe dann Hallo Welt 10 Buchstaben+Leerzeichen dann tut er die Zeile darunter mit zu ändern wobei ich nur die Zeile 3 ändern möchte.

    auch mit denn befehl "FileSetPos($OC, 0,$FILE_BEGIN)" bin ich nicht zufrieden da er nur Anfang,Aktuelle und End Position kann.

    Bitte um Hilfe

    Hier mal mein Test Skript

    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Constants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 615, 435, 192, 124)
    $Input1 = GUICtrlCreateInput("", 72, 48, 225, 21)
    $Input2 = GUICtrlCreateInput("", 72, 88, 225, 21)
    $Input3 = GUICtrlCreateInput("", 72, 128, 225, 21)
    $Button1 = GUICtrlCreateButton("Button1", 304, 48, 81, 25)
    $Button2 = GUICtrlCreateButton("Button2", 304, 88, 81, 25)
    $Button3 = GUICtrlCreateButton("Button3", 304, 128, 81, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    _Text()
    Case $Button2
    Case $Button3
    EndSwitch
    WEnd

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

    Func _Text()
    $Euro2 = GUICtrlRead($Input1)
    $OC = FileOpen('C:\KontoR\Hello.txt',1)
    FileSetPos($OC, 0,$FILE_BEGIN)
    FileWrite($OC, $Euro2)
    FileClose($OC)
    EndFunc

    [/autoit]

    Gruß Baron

  • auch mit denn befehl "FileSetPos($OC, 0,$FILE_BEGIN)" bin ich nicht zufrieden da er nur Anfang,Aktuelle und End Position kann.

    Das sind nur die Ausgangspositionen. Mit dem Offset-Parameter (der 2. Parameter - siehe Hilfe) kann dann davon ausgehend an jede beliebige Position in der Datei springen.

    In deinem Fall ist das aber sowieso eher schwierig da sich die Länge des zu ersetzenden Textes ändert.
    Also müssten alle nachfolgenden Zeichen um jeweils diesen Unterschied ebenfalls verschoben werden.
    Das geht zwar prinzipiell mit Filesetpos - ist aber verdammt aufwändig.

    Einfacher wäre stattdessen die Datei zeilenweise in ein Array einzulesen (mit FileReadLine oder FileReadToArray), die entsprechende Zeile im Array zu ändern, die Datei zu löschen und auf Grundlage des Arrays wieder neu zu schreiben (mit FileWriteLine oder FileWriteFromArray.

  • Du könntest mithilfe von "_FileListToArray" die Textdatei in einem Array speichern, dann den betreffenden Index(Zeile) bearbeitrn und wieder das Array wieder in ne Textdatei schreiben. :D

    Mfg

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • _ReplaceStringInFileist hierfür evtl. zu empfehlen.


    Absolut unbrauchbar da es in der Datei entweder alle (darf nicht sein, siehe Post 1) oder das 1. Vorkommen (Lotteriespiel, ist es das richtige?) ersetzt.

    Du könntest mithilfe von "_FileListToArray" die Textdatei in einem Array speichern,

    Das geht auch nicht, was soll er mt den Dateinamen?

    Einfacher wäre stattdessen die Datei zeilenweise in ein Array einzulesen (mit FileReadLine oder FileReadToArray), die entsprechende Zeile im Array zu ändern, die Datei zu löschen und auf Grundlage des Arrays wieder neu zu schreiben (mit FileWriteLine oder FileWriteFromArray.


    Klappt beides, ich würde aber die "_FileReadToArray / _FileWriteFromArray" Lösung vorziehen.

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (26. Dezember 2012 um 00:49)

  • Das ein und Auslesen mit dem befehl "_FileReadToArray" und "_FileWriteFromArray" wird in der Hilfe erklärt doch wie ändere ich die eingelesene Array und ersetze denn text.

    wenn ich z.B. folgene texte in der Datei Habe

    1.Lebensmittel
    2.Strom
    3.Kabelanschluss
    4.Versicherung

    und möchte dann denn Text "Kabelanschluss" in "High Speed" ändern.?

    es würde echt nett sein wenn einer ein beispiel Skript Basteln würde nach diese angaben. wie nur zeile 3 geändert wird ohne andere mit überschreibt.


    Danke schon mal in vorraus

    Gruß Baron

  • [autoit]


    #include <File.au3>
    #include <Array.au3>
    Local $aRecords
    _FileReadToArray("dings.txt", $aRecords)
    _ArrayDelete($aRecords, 0)
    For $i = 0 To UBound($aRecords) - 1
    $aRecords[$i] = StringReplace($aRecords[$i], "Kabelanschluss", "High Speed", 1, 1)
    Next
    _FileWriteFromArray("dings.txt", $aRecords)

    [/autoit]

    Wer andern eine Bratwurst brät
    der hat ein Bratwurstbratgerät.

  • Habe es ausprobiert und angepasst es klappt nun die frage ob man es nun so lassen kann oder da noch ein fehler versteckt ist.?


    [autoit]

    #include <File.au3>
    #include <Array.au3>
    Local $aRecords[20]
    _FileReadToArray("C:\KontoR\Ohr.txt", $aRecords)
    _ArrayDelete($aRecords, 0)
    For $i = 0 To UBound($aRecords) - 1
    $aRecords[$i] = StringReplace($aRecords[$i], $aRecords[2], "High Speed World German", 1, 1)
    Next
    _FileWriteFromArray("C:\KontoR\Ohr.txt", $aRecords)

    [/autoit]

    Gruß Baron

  • Dein Script sucht jetzt immer nach $aRecords[2], also nach der 3. Zeile.
    Ist es das, was du willst ?
    Ich bin davon ausgegangen, dass der Text in der 3. Zeile im Beispiel gesucht werden soll,
    offenbar willst du immer die 3. Zeile komplett ersetzen, egal was da drin steht ?

    Wer andern eine Bratwurst brät
    der hat ein Bratwurstbratgerät.

  • So in etwa habe ich es mir vorgestellt.

    Ich Baue einen Konto Rechner der Ausgaben und einnahmen berechnen tut der schon Fertig ist der aber mit dem Setzen von Texte mir nicht so zu sagt.

    wenn man die Gui Startet dann ist auf der Linkenseite gleich 20 Inputfelder wo man dann eintragen kann für die ausgaben die jeweiligen Titel der Ausgabe wie z.B. Strom,Kabelanschluss usw. das ganze wird gespeichert so das man wenn die Gui neu Startet der Text beibehalten wird. würdet man z.b. denn Kabelanschluss nicht mehr benötigen oder ein anderen text vergeben soll das innerhalb der Inputfeld ausgelöst werden und jedes Inputfeld ist mit die zeilen des Textes verangert.

    hier mal ein Bild wie ich es meine

    [Blockierte Grafik: http://s3.imgimg.de/uploads/Konto99ada714bpng.png]

  • Dann wird das hier wohl besser passen:

    [autoit]


    #include <File.au3>
    #include <Array.au3>
    Local $zeile = 3
    Local $neutext = "High Speed World German"
    Local $aRecords[20]
    _FileReadToArray("C:\KontoR\Ohr.txt", $aRecords)
    $aRecords[$zeile] = $neutext
    _ArrayDelete($aRecords, 0)
    _FileWriteFromArray("C:\KontoR\Ohr.txt", $aRecords)

    [/autoit]

    Wer andern eine Bratwurst brät
    der hat ein Bratwurstbratgerät.

  • C
    #include <File.au3>
    #include <Array.au3>
    Local $zeile = 3
    Local $neutext = "High Speed World German"
    Local $aRecords[20]
    _FileReadToArray("C:\KontoR\Ohr.txt", $aRecords)
    $aRecords[$zeile] = $neutext
    _ArrayDelete($aRecords, 0)
    _FileWriteFromArray("C:\KontoR\Ohr.txt", $aRecords)

    Ja Finde ich auch und ist leichter gehalten und geht 1A

    Danke ohforf