Spalten eines Arrays löschen

  • Hallo allerseits,

    ich bin noch sehr neu in der AutoIt Programmierung und habe folgende Frage:

    Ich lese von einem Server den Schedul-Task aus, filtere ihn, sodass nur meine eingerichteten Tasks angezeigt werden und speichere alles in eine .csv-Datei. Bis dahin ging ja alles gut. Anschließend lese ich die .csv Datei in ein Array ein. Nun möchte ich aber einige Spalten, die ich absolut nicht benötige aus dem Array entfernen und das bereinigte Array aus der Funktion übergeben. Wie kann ich vor der Übergabe die nicht benötigten Array-Spalten löschen - leider finde ich nichts Brauchbares. Kann mir da jemand helfen?

    [autoit]

    Global $Server
    Global $a_task
    Func _taskread($server)
    If FileExists(@WorkingDir&"\taskerg_"&$Server&".txt") Then
    FileDelete(@WorkingDir&"\taskerg_"&$Server&".txt")
    EndIf

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

    If FileExists(@WorkingDir&"\taskerg_"&$server&".csv") Then
    FileDelete(@WorkingDir&"\taskerg_"&$server&".csv")
    EndIf

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

    RunWait(@ComSpec & " /c " & "schtasks /query /fo CSV /s "&$server&" /v > "&@WorkingDir&"\taskerg_"&$server&".txt",@WorkingDir,@SW_HIDE)
    Sleep(2000)

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

    If FileExists(@WorkingDir&"\taskerg_"&$server&".txt") Then
    Global $a_task
    Global $taskread
    _FileReadToArray(@WorkingDir&"\taskerg_"&$server&".txt",$a_task)
    If IsArray($a_task) Then
    $ergfile=FileOpen(@WorkingDir&"\taskerg_"&$server&".csv",1)
    For $x=1 To $a_task[0]
    $szeile=StringReplace($a_task[$x],'","',";")
    $szeile=StringReplace($szeile,'"',"")
    If Not StringInStr($szeile,"Hostname") And Not StringInStr($szeile,"\Microsoft\") And Not StringInStr($szeile,"\OfficeSoftwareProtectionPlatform\") Then
    FileWriteLine($ergfile,$szeile)
    EndIf
    Next
    FileClose($ergfile)
    _FileReadToArray(@WorkingDir&"\taskerg_"&$server&".csv",$taskread)
    Else
    Return(0)
    EndIf
    Else
    Return(0)
    EndIf

    [/autoit]

    Einmal editiert, zuletzt von mr_merlin (17. Oktober 2012 um 16:51) aus folgendem Grund: Danke!

  • Mir würde nur einfallen den Array in einer Schleife komplett durchgehen und nur die benötigten Spalten in neuen Array schreiben.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Mir würde nur einfallen den Array in einer Schleife komplett durchgehen und nur die benötigten Spalten in neuen Array schreiben.

    Danke für die rasche Antwort,

    ich werde das so lösen. Hatte vorerst gedacht, dass dies ein wenig einfacher gehen würde. Obwohl die Array-Behandlung in AutoIT wirklich schon sehr mächtig ist, gibt es doch nicht alles. Nur wenn ich bedenke, welchen Code ich für so Manches in C# schreiben müsste, ist AutoIT für den täglichen Gebrauch einfach ein Hit.

    Schöne Grüße

    mr_merlin

    • Offizieller Beitrag

    Es gibt auch noch die Möglichkeit alles, was man nicht braucht, ans Ende des Arrays zu verschieben und am Schluß ein ReDim zu machen. Hier ein Beispiel:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    Global $array[8] = ['a4', 'b5', 'c7', 'd5', 'e6', 'f5', 'g5', 'h6']
    Global $iEnd = UBound($array) - 1, $i = 0
    Do
    If StringInStr($array[$i], '5') Then ; alle Einträge mit einer '5' sollen raus.
    _Switch($array, $i, $iEnd)
    $iEnd -= 1
    Else
    $i += 1
    EndIf
    Until $i > $iEnd
    ReDim $array[$iEnd + 1]
    _ArrayDisplay($array)

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

    Func _Switch(ByRef $array, $i, $j)
    Local $sTmp
    $sTmp = $array[$i]
    $array[$i] = $array[$j]
    $array[$j] = $sTmp
    EndFunc ;==>_Switch

    [/autoit]
  • Um zu löschen braucht man ja eigentlich nur die nachfolgenden Spalten um eins nach vorn zu verschieben und dann ein ReDim durchführen.

    Beispiel:

    Spalte in 2D-Array löschen
    [autoit]

    #include <Array.au3>

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

    ; ------ Testarray erstellen -----------------
    Global $a_Array[100][5]
    For $i = 0 To 99
    For $j = 0 To 4
    $a_Array[$i][$j] = $i * ($j + 1)
    Next
    Next
    _ArrayDisplay($a_Array, "Vorher")
    ; --------------------------------------------

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

    ; Lösche 3. Spalte und zeige das Ergebnis an:
    If ArrayDeleteColumn($a_Array, 2) Then
    _ArrayDisplay($a_Array, "Nachher")
    Else
    MsgBox(0, "Fehler", "Fehler beim löschen aufgetreten" & @CRLF & "Fehlercode: " & @error)
    EndIf

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

    ; Löscht aus einem 2D-Array eine Spalte (0-basierte Angabe)
    Func ArrayDeleteColumn(ByRef $a_Arr, $d_Column = 0)
    ;by AspirinJunkie
    Local Const $NROWS = UBound($a_Arr)
    Local Const $NCOLS = UBound($a_Arr, 2)
    If @error Then Return (SetError(1, @error, False))
    If $d_Column > $NCOLS - 1 Then Return (SetError(2, 0, False))

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

    For $row = 0 To $NROWS - 1
    For $col = $d_Column + 1 To $NCOLS - 1
    $a_Arr[$row][$col - 1] = $a_Arr[$row][$col]
    Next
    Next

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

    ReDim $a_Arr[$NROWS][$NCOLS - 1]

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

    Return True
    EndFunc ;==>ArrayDeleteColumn

    [/autoit]