Leere Elemente aus einem (Ergebnis) Array löschen

  • Guten Abend,
    leider komme ich nicht so recht weiter, daher wende ich mich 'vertrauensvoll' hier ans Forum, mit der Hoffnung auf einen Tip ...

    Problem:
    Nach einem rekursiven FileSync zw. zwei Diretories (_RecursiveFileListToArray) und dem Check auf den Sync (mache ich mitttels Vgl. (Verz)Array 1 gegen (Verz)Array 2 ...)
    erhalte ich in dem(Ergebnis) Array je nach Konstellation leere Elemente (Zeilen), was für die Weitergabe bzw.-verarbeitung unschön ist.
    Diese leeren Elemente erzeugen sich immer dann, wenn gefiltert nach file extensions gesucht wird, die auf der einen Seite nicht vorhanden sind.

    Frage:
    Wie lösche ich im Ergebnis (Array) die leeren Elemente ???

    Anm:
    Das Ergebnis Array sieht wie folgt aus (Struktur)

    Row Col0 Col1 Col2 Col3 Col4
    [0] 2 path1 path2 diff
    [1] only on p1
    [2] file only on p2

    nun sollte Element [1] - weil leer - noch entfernt werden


    Danke
    Gruss
    UGT100

    Einmal editiert, zuletzt von ugt100 (26. Februar 2013 um 13:12)

  • Hab dafür grade mal eine Funktion gebastelt (obwohl ich sicher bin, dass es sowas schon irgendwo geben muss).
    Ist auf Tempo ausgelegt und braucht kein Include. Läuft aber nur mit 1D Arrays.

    Skript
    [autoit]

    ; Wird nur für _ArrayDisplay gebraucht.
    #include <Array.au3>

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

    Global $a[10]

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

    For $i = 0 To 9 Step 1
    $a[Random(0, 9, 1)] += Random(1, 5, 1)
    Next

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

    _ArrayDisplay($a)

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

    _ArrayDeleteEmpty($a)

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

    _ArrayDisplay($a)

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

    Func _ArrayDeleteEmpty(ByRef $a)
    Local $u = UBound($a) - 1
    For $i = $u To 0 Step -1
    If Not $a[$i] Then
    For $e = $i To $u - 1 Step 1
    $a[$e] = $a[$e + 1]
    Next
    $u -= 1
    EndIf
    Next
    ReDim $a[$u + 1]
    EndFunc

    [/autoit]

    Edit: Mit ArraySearch und ArrayDelete würde das min. 10x so lange dauern...
    lg
    Mars

  • Hi All,

    super und vielen Dank für die klasse Unterstützung.
    Ich habe das mit dem ArraySearch soweit umgesetzt und es funzt soweit.
    Die zweite Lösung von Mars habe ich auch getestet, mangels Masse (sprich zu grossen Unterschiede) kann ich zum Tempo nichts sagen.

    Nochmals DANKE

    Gruss
    UGT100

  • Edit: Mit ArraySearch und ArrayDelete würde das min. 10x so lange dauern...


    und da:

    Läuft aber nur mit 1D Arrays.

    ist es für diesen Fall unbrauchbar.

    Hier ein Beispiel wie du es lösen kannst:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    Global $a2D[1000][4]

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

    For $i = 1 To UBound($a2D) - 1
    For $j = 0 To UBound($a2D, 2) - 1
    $k = Random(0, 26, 1)
    Switch $k
    Case 0
    ;do nothing
    Case Else
    $a2D[$i][$j] = Chr($k + 96)
    EndSwitch
    Next
    Next
    $a2D[0][0] = UBound($a2D)
    _ArrayDisplay($a2D, "Original")

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

    $iMSec = TimerInit()
    If _DeleteEmpty($a2D, 1) Then
    $iMSec = TimerDiff($iMSec)
    ConsoleWrite($iMSec & @CRLF)
    _ArrayDisplay($a2D, "Leere in Col" & $i & " gelöscht in " & $iMSec)
    Else
    ConsoleWrite('Fehler: ' & @error & @CRLF)
    EndIf

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

    $iMSec = TimerInit()
    If _DeleteEmpty($a2D, 5) Then
    $iMSec = TimerDiff($iMSec)
    ConsoleWrite($iMSec & @CRLF)
    _ArrayDisplay($a2D, "Leere in Col" & $i & " gelöscht in " & $iMSec)
    Else
    ConsoleWrite('Fehler: ' & @error & @CRLF)
    EndIf

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

    $iMSec = TimerInit()
    If _DeleteEmpty($a2D, -1) Then
    $iMSec = TimerDiff($iMSec)
    ConsoleWrite($iMSec & @CRLF)
    _ArrayDisplay($a2D, "Leere in allen weiteren Cols gelöscht in " & $iMSec)
    Else
    ConsoleWrite('Fehler: ' & @error & @CRLF)
    EndIf

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

    Func _DeleteEmpty(ByRef $aArray, $iCol)
    If $iCol > UBound($aArray, 2) - 1 Then
    SetError(1, 0, 0)
    Return
    EndIf
    For $i = UBound($aArray) - 1 To 1 Step -1
    If $iCol = -1 Then
    For $j = UBound($aArray, 2) - 1 To 0 Step -1
    If $aArray[$i][$j] = '' Then _ArrayDelete($aArray, $i)
    Next
    Else
    If $aArray[$i][$iCol] = '' Then _ArrayDelete($aArray, $i)
    EndIf
    Next
    $aArray[0][0] = UBound($aArray)
    Return 1
    EndFunc ;==>_DeleteEmpty

    [/autoit]

    Edit: Fehlerbehandlung eingebaut

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (26. Februar 2013 um 15:06)


  • und da:

    ist es für diesen Fall unbrauchbar.

    Zum Zeitpunkt meines Posts stand im Thread noch nichts von 2D Arrays.
    Edit: Oder ich habs überlesen. Normalerweise biete ich keine Lösungen an die nicht funktionieren.