Daten in Datei/Array rotieren

  • Hallo zusammen,

    ich hoffe ihr könnt mir helfen. Ich würde gerne folgendes realisieren. Daten werden aus einer Datei eingelesen und durch eine for-Schleife verarbeitet. Die Stelle an der die for Schleife abbricht soll nun in der eingelesenen Datei als erstes geschrieben werden und die benutzten Daten hinten angestellt werden, so dass bei einem neuen Start mit dem ersten nicht benutzten Datum begonnen wird.

    [autoit]

    $csvFile = "C:\Datei.txt"
    _FileReadToArray($txtFile, $arTXT)

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

    For $i = 1 To $arTXT[0]
    If [Bedingung] Then
    MsgBox(0,"Läuft:", "Bedingung momentan erfüllt" )
    Else
    MsgBox(0,"Abgebrochen:", "Bedingung momentan nicht erfüllt" )
    $arTXT[$i] = $arNeu[1] ; Wie lässt es sich hier für alle vorherigen und folgenden Elemente realisieren?
    ExitLoop

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

    EndIf
    Next

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

    _FileWriteFromArray($txtFile, $arNeu, 1)
    FileClose($txtFile)

    [/autoit]

    Mir ist klar, dass es nicht so wie in Zeile 9 geht, aber dies wurde gemacht um es zu verdeutlichen.
    Gibt es vllt sogar eine Funktion, die ich bei meiner Suche bei Google nicht gefunden habe, um ein Array so zu rotieren, dass $ar[$i] zu $ar[1] wird und der Rest weiterrutscht?

    Spoiler anzeigen


    Wenn die Datei vorher so aussieht:

    Code
    #1
    #2
    #3
    #4
    #5
    #6
    #7


    und die for Schleife bei $i = 4 abbricht, sollte die Datei nachher so aussehen:

    Code
    #4
    #5
    #6
    #7
    #1
    #2
    #3

    2 Mal editiert, zuletzt von falu (4. Januar 2011 um 21:20)

  • Hallo falu,

    herzlich willkommen im Forum und viel Spass mit AutoIt.

    Hier kannst du dir die Hilfe herunterladen.
    Hier gibt es ein AutoIt-Tutorial: http://wiki.autoit.de/wiki/index.php/TutorialSehr hilfreich ist auch das Buch von peethebee

    und jetzt zu deinem Problem: dafür ist _ArrayPush geeignet einzige Bedingung das Array muss 0 baierend sein. Hier dein Beispiel:

    [autoit]

    #include <file.au3>
    #include <Array.au3>
    $arTXT = 1
    $csvFile = @ScriptDir & "\ArrayPart.csv"
    _FileReadToArray($csvFile,$arTXT)
    _ArrayDelete($arTXT,0) ;Array muss 0 baierend sein sonst klappt _ArrayPsh nicht
    _ArrayDisplay($arTXT)
    $k = UBound($arTXT)-1
    ConsoleWrite($k & @CRLF)

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

    $j= 4
    For $i = 0 To $j
    If $i < $j Then
    MsgBox(0, "Läuft:", "Bedingung momentan erfüllt")
    _ArrayPush($arTXT,$arTXT[0])
    Else
    MsgBox(0, "Abgebrochen:", "Bedingung momentan nicht erfüllt")
    ExitLoop

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

    EndIf
    Next
    _ArrayDisplay($arTXT)

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

    ;_FileWriteFromArray($csvFile, $arTXT, 1) ;nach testen Auskommentierung entfernen

    [/autoit]

    Frohes gutes neues Jahr autoBert

  • Kann sein, dass ich das jetzt falsch verstehe aber wäre es nicht einfacher das Array direkt um 4 Stellen zu rotieren? Ich habe dafür nämlich mal eine Funktion gemacht...

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _ArrayShift
    ; Description ...: Verschiebt den Inhalt eines Array um die angegebene Zahl nach links oder rechts
    ; Syntax.........: _ArrayShift(ByRef $aShift, $iShift)
    ; Parameters ....: $aShift - Zu bearbeitendes Array
    ; $iShift - Integerzahl um die verschoben werden soll (Bei $iShift < 0 wird nach links verschoben)
    ; Return values .: Erfolg - 1
    ; Fehler - 0, setzt @error:
    ; |-1 - $aShift ist kein Array
    ; |-2 - $iShift ist keine Integerzahl
    ; Author ........: name22, clezZ
    ; ===============================================================================================================================
    Func _ArrayShift(ByRef $aShift, $iShift)
    If Not IsInt($iShift) Then Return SetError(-2, 0, 0)
    If Not IsArray($aShift) Then Return SetError(-1, 0, 0)

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

    $iShift *= -1
    Local $iSize = UBound($aShift)

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

    If $iShift < 0 Then
    $iShift *= -1
    $iShift = $iSize - $iShift
    EndIf
    If $iShift > $iSize Then
    While $iShift > $iSize
    $iShift -= $iSize
    WEnd
    EndIf

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

    Local $aBuffer[$iSize]
    For $i = 0 To $iSize - 1
    $iNew = $i + $iShift
    If $iNew > $iSize - 1 Then $iNew -= $iSize
    $aBuffer[$i] = $aShift[$iNew]
    Next

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

    $aShift = $aBuffer
    Return 1
    EndFunc ;==>_ArrayShift

    [/autoit]
  • Je nachdem, was Du sonst noch mit den Daten vorhast, könnten es auch reine Stringoperationen tun:

    [autoit]

    ; $Daten = FileRead("FilePath")
    $Daten = "#1" & @CRLF & "#2" & @CRLF & "#3" & @CRLF & "#4" & @CRLF & "#5" & @CRLF & "#6" & @CRLF & "#7"
    ; Falls an der letzen Zeile ein Zeilenwechsel hängt, wird er in $NeueZeile aufbewahrt und entfernt
    $NeueZeile = ""
    If StringRight($Daten, 2) = @CRLF Then
    $NeueZeile = StringRight($Daten, 2)
    $Daten = StringTrimRight($Daten, 2)
    EndIf
    $Anzahl = 4 ; Anzahl der Rotationen
    $Rotiert = 0 ; bereits ausgeführte Rotationen
    While True
    If $Rotiert < $Anzahl Then
    $Pos = StringInStr($Daten, @CRLF, 1)
    If $Pos Then
    $Daten = StringMid($Daten, $Pos + 2) & @CRLF & StringLeft($Daten, $Pos - 1)
    EndIf
    $Rotiert += 1
    Else
    ExitLoop
    EndIf
    WEnd
    MsgBox(0, $Anzahl & " Rotationen", $Daten & $NeueZeile)
    Exit

    [/autoit]
  • Vielen Dank erstmal für die vielen Antworten.

    Habe nur die Lösung mit _ArrayPush probiert und sie hat auf Anhieb funktioniert. Da diese Funktion im Tutorial nicht erwähnt ist, habe ich sie auch nicht selber gefunden, zumal ich beim anderweitigen suchen irgendwie die falschen Begriffe benutzt habe.

    Mir ist nur nicht ganz klar, wofür man diesen Teil benötigt:

    [autoit]

    $k = UBound($arTXT)-1
    ConsoleWrite($k & @CRLF)

    [/autoit]

    Die Größe des Array wird bestimmt und diese dann mit angehängtem Zeilensprung in den STDOUT-Stream geschrieben. Was passiert dabei? Das Skript funktioniert bei mir jedenfalls auch ohne diesen Teil. Du wirst dir aber wohl irgendwas dabei gedacht haben...

  • Das Skript funktioniert bei mir jedenfalls auch ohne diesen Teil. Du wirst dir aber wohl irgendwas dabei gedacht haben...


    Genau wie von name22 beschrieben ich hatte einen Laufzeitfehler und habe daraufhin an verschiedenen Stellen das Skript beobachtet, diese Zeile habe ich vergessen zu entfernen,

    mfg autoBert