Textfile bearbeiten - gar nicht so einfach..

  • Ich brauche wieder einmal eure Hilfe

    Ich habe folgendes 4 zeiliges Textfile, welches ich bearbeiten muss:

    Zitat

    !arte 1
    !eine Umgebung 1 servername.domain.com
    Warte 2
    Meine Umgebung 2 servername2.domain.com


    Die Zeilen mit ! sind auskommentiert (dh das Ausrufezeichen ersetzt das erste Zeichen). Im obigen Beispiel ist Umgebung 2 aktiv. Es kann aber jeder Zustand vorliegen, Umgebung 1 aktiv , oder Umgebung 2 oder beide.

    Nun soll ich via Script setzen können, dass entweder Umgebung 1 oder Umgebung 2 aktiv sind - oder beide.

    Mein Ansatz mit

    [autoit]

    _FileWriteToLine($filename, 1, "Warte 1", 1)

    [/autoit]

    und

    [autoit]


    $find = "!eine Umgebung 1"
    $replace = "Meine Umgebung 1"
    $retval = _ReplaceStringInFile($filename,$find,$replace)

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

    scheint mir etwas sehr hakelig 8| Wie könnte man dies elegant lösen? Zudem muss es auch wieder umstellbar sein, und spätestens da ist meine Lösung zu undynamisch. ;(

    Danke euch!

    Surfy

    2 Mal editiert, zuletzt von Surfy (4. Oktober 2012 um 15:02)

  • Kannst Du mir ein Beispiel für eine Zeile zeigen, worauf ich dann aufbauen kann?

    Das exakte Zeilenweise bearbeiten - monentan sehe ich da nur einen (grossen) Bahnhof 8|

  • [autoit]


    $sZeile = "Meine Umgebung 2 servername2.domain.com"

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

    ;Deaktivieren
    $sZeile = "!" & StringTrimLeft($sZeile,1)
    ConsoleWrite("Deaktiviert: " & $sZeile & @CRLF)
    ;Aktivieren
    $sZeile = "M" & StringTrimLeft($sZeile,1)
    ConsoleWrite("Aktiviert: " & $sZeile & @CRLF)

    [/autoit]

    Oder meintest du was anderes?

    lg chess

  • Danke dir

    Vom prinzip würde es damit ja schon gehen.

    Aber im Detail - habe ich da 4 Zeilen in einem Textfile, und nicht eine Zeile. Woher soll die $szeile wissen, in welcher Zeile sie gerade steckt, bzw welche gerade zu aktivieren wäre?

    Meine Frage zielt eigentlich darauf ab, wie ich dieses Textfile Zeilenweise gezielt bearbeiten kann, und dann wie ich das beabeiten kann. Das wie, mit Stringtrim - hast Du mir schon gezeigt :rolleyes:

    Der genaue Inhalt des Files ist auch unbekannt, dh es gibt mehrere Domains und Server.

    Ich müsste das File am besten einlesen, und dann zeilenweise bearbeiten können, und dann so die Zeile aktivieren oder deaktivieren.

    Surfy

    Einmal editiert, zuletzt von Surfy (3. Oktober 2012 um 13:21)

  • Ich denke das hier ist was er meint:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    Local $File, $Path = @ScriptDir & '\test.txt'
    _FileReadToArray($Path, $File)
    If @error Then Exit
    For $i = 1 To $File[0] Step +2
    If StringLeft($File[$i], 1) = '!' Then
    $File[$i] = 'W' & StringTrimLeft($File[$i], 1)
    $File[$i + 1] = 'M' & StringTrimLeft($File[$i + 1], 1)
    Else
    $File[$i] = '!' & StringTrimLeft($File[$i], 1)
    $File[$i + 1] = '!' & StringTrimLeft($File[$i + 1], 1)
    EndIf
    Next
    FileDelete($Path)
    _FileWriteFromArray($Path, $File, 1)

    [/autoit]

    LG
    Christoph :)

  • Danke für eure Hilfe - so langsam gehts in die Richtige Richtung :thumbup:

    @ Christoph: leider läuft dein Script nicht - fehlen mir da includes?

    Es gibt ja drei zustände, die möglich sind:

    1.) Alle Umgebungen sollen aktiv sein - keine Ausrufezeichen

    2.) nur die obere Umgebung soll aktiv sein

    3.) nur die untere Umgebung soll aktiv sein


    Zitat

    Warte 1
    Meine Umgebung 1 servername.domain.com
    Warte 2
    Meine Umgebung 2 servername2.domain.com

    Nun kann ich zwar (dank eurer Hilfe) - das ganze einlesen und anzeigen, soweit kann ich den Script von Chris verstehen..


    [autoit]

    #include <file.au3>
    Dim $aRecords
    If Not _FileReadToArray("c:\MyTextfile",$aRecords) Then
    MsgBox(4096,"Error", " Error reading log to Array error:" & @error)
    Exit
    EndIf

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

    MsgBox(4096, "Test", $aRecords[1], 10)

    [/autoit]

    nun kann ich einfach via

    $aRecords[1]=StringTrimLeft($aRecords[1],1)

    Und dann via $aRecords[1]='!' & $aRecords[1] das ganze wieder zusammensetzen :wacko:

    Hinkriegen sollte ich es damit - auch wenn elegant sicher anders ist :rolleyes:

    Danke euch,

    Surfy

    PS: so lerne auch ich die Arrays langsam :love:

  • Zitat

    @ Christoph: leider läuft dein Script nicht - fehlen mir da includes?

    Nein da fehlen keine Includes, bei mir (Win7) läuft das 1a, mit einer Text-Datei die den Inhalt aus dem Startpost hat... Was bekommst denn für eine Fehlermeldung? :huh:

    LG
    Christoph :)

  • In Zeile 11 gibts ärger:

    Zitat

    TestIng.au3 (11) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:


    Danke für deine Hilfe!

  • Dann sieht deine 'Settings'-datei nicht so aus, wie du sie oben gepostet hast! Kannst du nicht das Original posten?
    Edit: Dieses Script sollte nun genau das erledigen was du vor hast:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Array.au3> ; Kann nach Test mit _ArrayDisplay gelöscht werden...

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

    _SetState(0, @ScriptDir & '\t.txt') ; Beide auskommentiert
    _SetState(1, @ScriptDir & '\t.txt') ; 1 auskommentiert
    _SetState(2, @ScriptDir & '\t.txt') ; 2 auskommentiert

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

    Func _SetState($State, $Path)
    Local $File = StringSplit(StringReplace(StringReplace(FileRead($Path), '!a', 'Wa'), '!e', 'Me'), @LF)
    If $State = 1 Or $State = 0 Then
    $File[1] = '!' & StringTrimLeft($File[1], 1)
    $File[2] = '!' & StringTrimLeft($File[2], 1)
    EndIf
    If $State = 2 Or $State = 0 Then
    $File[3] = '!' & StringTrimLeft($File[3], 1)
    $File[4] = '!' & StringTrimLeft($File[4], 1)
    EndIf
    FileDelete($Path)
    _ArrayDisplay($File, 'State: ' & $State) ; Kann nach Test gelöscht werden...
    _FileWriteFromArray($Path, $File, 1, 4)
    EndFunc ;==>_SetState

    [/autoit]

    LG
    Christoph :)

    Einmal editiert, zuletzt von BinDannMalWeg (3. Oktober 2012 um 15:57)

  • Danke Dir - genau das habe ich umsetzen wollen!

    Nur einen Zustand habe ich vergessen - das beide aktiv sein können :huh:

    Quasi also : "keiner auskommentiert" Obwohl ich Deine Zeilen im groben verstehe - wüsste ich nicht wie ich das einbauen kann, oder ob ich nur nicht sehe wie anstossen :S

    Danke für Deine Hilfe,

    Surfy

  • Kein Ding... ^^

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Array.au3> ; Kann nach Test mit _ArrayDisplay gelöscht werden...

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

    _SetState(0, @ScriptDir & '\t.txt') ; Nichts auskommentiert
    _SetState(1, @ScriptDir & '\t.txt') ; 1 auskommentiert
    _SetState(2, @ScriptDir & '\t.txt') ; 2 auskommentiert
    _SetState(3, @ScriptDir & '\t.txt') ; Beide auskommentiert

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

    Func _SetState($State, $Path)
    Local $File = StringSplit(StringReplace(StringReplace(FileRead($Path), '!a', 'Wa'), '!e', 'Me'), @LF)
    If Not $State = 0 Then
    If $State = 1 Or $State = 3 Then
    $File[1] = '!' & StringTrimLeft($File[1], 1)
    $File[2] = '!' & StringTrimLeft($File[2], 1)
    EndIf
    If $State = 2 Or $State = 3 Then
    $File[3] = '!' & StringTrimLeft($File[3], 1)
    $File[4] = '!' & StringTrimLeft($File[4], 1)
    EndIf
    EndIf
    FileDelete($Path)
    _ArrayDisplay($File, 'State: ' & $State) ; Kann nach Test gelöscht werden...
    _FileWriteFromArray($Path, $File, 1, 4)
    EndFunc ;==>_SetState

    [/autoit]

    LG
    Christoph :)

  • Hallo Surfy,

    und hier noch eine andere Lösung mit GUI:

    Spoiler anzeigen
    [autoit]

    ; *** Start added by AutoIt3Wrapper ***
    #include <ListViewConstants.au3>
    #include <GuiListView.au3>
    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <File.au3>
    Local $aServers, $Path = @ScriptDir & '\servers.dat'
    _FileReadToArray($Path, $aServers)
    If @error Then
    MsgBox(16, "Fehler", @ScriptDir & '\servers.dat' & @CRLF & 'nucht gefunden!')
    Exit
    EndIf
    ;_ArrayDisplay($aServers)
    $hGUI = GUICreate("Server-Manager v1.0 ", 420, 300, 20, 20)
    GUISetBkColor(0x00E0FFFF) ; will change background color
    $idLV_Servers = GUICtrlCreateListView("aktiv?|Server", 10, 10, 400, 165, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS), BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER, $LVS_EX_CHECKBOXES))
    For $i = 1 To $aServers[0]
    $id = $i*2 - 1
    ;consoleWrite($aServers[0]&" "&$id &" "&$i & @TAB)
    If $id > $aServers[0] Then ExitLoop
    $aSplit = StringSplit($aServers[$id+1], " ")
    if @error Then ExitLoop
    GUICtrlCreateListViewItem(" |" & $aSplit[4], $idLV_Servers)
    ;_ArrayDisplay($aSplit)
    If StringLeft($aSplit[1], 1) <> '!' Then
    _GUICtrlListView_SetItemChecked($idLV_Servers, $i-1)
    ;ConsoleWrite(" checked " & @CRLF)
    EndIf
    Next
    GUISetState()
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Dim $aServers[_GUICtrlListView_GetItemCount($idLV_Servers) * 2]
    For $i = 0 To _GUICtrlListView_GetItemCount($idLV_Servers) - 1
    ;Schleifenbeginn da das erste Item den Index 0 hat von 0 bis Anzahl -1
    ;ConsoleWrite('Warte ' & $i + 1 & @CRLF)

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

    If _GUICtrlListView_GetItemChecked($idLV_Servers, $i) Then ; wenn geChecked (angehakt) dann
    $aServers[$i * 2] = 'Warte ' & $i + 1
    $aServers[$i * 2 + 1] = 'Meine Umgebung ' & $i + 1 & ' ' & _GUICtrlListView_GetItemText($idLV_Servers, $i, 1)
    Else
    $aServers[$i * 2] = '!arte ' & $i + 1
    $aServers[$i * 2 + 1] = '!eine Umgebung ' & $i + 1 & ' ' & _GUICtrlListView_GetItemText($idLV_Servers, $i, 1)
    EndIf
    ; _ArrayDisplay($aServers)
    Next
    _FileWriteFromArray($Path, $aServers)
    Exit
    EndSwitch
    WEnd

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

    die Servers.dat kann unendlich viele Einträge emthalten:

    Code
    Warte 1
    Meine Umgebung 1 servername1.domain.com
    !arte 2
    !eine Umgebung 2 servername2.domain.com
    !arte 3
    !eine Umgebung 3 servername3.domain.com
    Warte 4
    Meine Umgebung 4 servername4.domain.com

    und in der GUI können sie deaktiviert und aktiviert werden.

    mfg autoBert

  • Ich danke euch beiden!

    [autoit]

    $File = StringSplit(StringReplace(StringReplace(FileRead($Path)

    [/autoit]

    Das sind mindestens zwei Verschachtelungen zuviel, (nicht nur) am frühen morgen ;(

    Surfy

  • Hallo,
    es könnte sein das unter Ms-Dos Probleme mit @LF geben könnte... Versuche mal @CR statt @LF für 'End-Of-Line'.
    Und es könnte auch sein das _FileWiteFromArray ein @CRLF als EOL setzt und daher die ganzen Fehler entstehen ;)

    Grüsse!

    Einmal editiert, zuletzt von Techmix (4. Oktober 2012 um 15:34)

  • ^^ich Denke auch...
    Dann mußt du die Datei Manuell schreiben mit sowas:

    [autoit]


    Local $hFile=FileOpen($Path, 10)
    for $i = 1 to $aServers[0]
    FileWriteLine($hFile, $aServers[$i]&@CR) ; Versuche erst dies
    ;FileWriteLine($hFile, $aServers[$i]&@LF) ; Oder das
    Next
    FileClose($hFile)

    [/autoit]


    Mußt nurnoch an dein Script anpassen...

    Grüsse!

    Einmal editiert, zuletzt von Techmix (4. Oktober 2012 um 17:26)

  • @CR setzt einfach auch noch eine Leerzeile dazwischen - dh es muss mit FilewritefromArray ein Problem geben... ;(Surfy

    Kann eigentlich nicht sein den das von mir in #14 gepstete Skript habe ich mehrfach hintereinder getestet. Die geschriebene Datei wird anstandslos wieder eingelesen. Ich benutze AutroIt 3.3.6.1 auf Win XP SP3

    mfg autoBert