leeres Feld im Array löschen

  • Hi,
    ich habe mit

    [autoit]

    _FileReadToArray("file.txt",$file_Array)

    [/autoit]

    eine Datei eingelesen. Wenn ich diese dann mit

    [autoit]

    _FileWriteFromArray("file.txt",$file_Array)

    [/autoit]

    abspeicher, dann habe ich ein leeres Feld. Das summiert sich halt von mal zu mal. Ich habe folgendes ohne Erfolg in einer Schleife versucht:

    [autoit]


    for $i = 1 to $file_Array[0]
    if $file_Array[$i] = " " Then _ArrayDelete($file_Array,$i)
    next

    [/autoit]

    Was ist hier falsch?

    Danke

    edit:
    wenn ich es so mache, dann erhalte ich Error:Array variable has incorrect number of subscripts or subscript dimension range exceeded.

    [autoit]


    for $i=1 to $sort_Array[0]
    if (StringLen($sort_Array[$i]) = 0) Then _ArrayDelete($sort_Array,$i)
    Next

    [/autoit]

    2 Mal editiert, zuletzt von sunghost (23. November 2007 um 10:02)

  • Wenn du ArrayDelete in einer For-Schleife nutzt, wird beim Löschen das Array kleiner und deine $i-Variable führt nicht mehr den korrekten Index mit:

    Bei 10 Elementen ist das 3 das zu Löschende. $i=2. Wenn du dann ArrayDelete($array,$i) ausführst ist $i bei dem nächsten Lauf 3 und ein element wurde ausgelassen. Das Array jetzt kleiner ist und die For-Schleife läuft trotzdem bis 9. Also => ERROR.

    Spoiler anzeigen
    [autoit]


    #include <array.au3>

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

    Local $arr_1[9]=[8," ","Bernd","","Heinz","Holger","","Jürgen"," "]
    Local $arr_2[8]=[" ","Bernd","","Heinz","Holger","","Jürgen"," "]

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

    _deleteBlanks($arr_1)
    _ArrayDisplay($arr_1,"Edited")

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

    Func _deleteBlanks(ByRef $array)
    If IsArray($array) < 1 then Return 0

    $bound = Ubound($array)-1
    Local $i=0
    Local $isZeroIndex = 0

    If $array[0] = $bound then
    $isZeroIndex=1
    $i=1
    EndIf

    while $i<= $bound
    If $array[$i]="" or StringIsSpace($array[$i]) > 0 then
    _ArrayDelete($array, $i)
    $bound=$bound-1
    If $isZeroIndex > 0 then $array[0]=$array[0]-1
    Else
    $i=$i+1
    Endif
    Wend
    EndFunc

    [/autoit]


    Der Funktion kannst du Arrays mit dem ZeroIndex-Element oder auch normale Arrays übergeben.

    Einmal editiert, zuletzt von zio82draw (23. November 2007 um 10:48)

  • hey super, das funktioniert - macht auch Sinn, da ich ein eindimensionales Array verwendet habe, habe ich die Func abgespeckt, ist das dennoch so ok?

    [autoit]


    $bound = UBound($sort_Array)-1
    While $i < $bound
    If $sort_Array[$i]=""Then
    _ArrayDelete($sort_Array,$i)
    $bound=$bound-1
    $sort_Array[0]=$sort_Array[0]-1
    Else
    $i=$i+1
    EndIf
    WEnd

    [/autoit]
    • Offizieller Beitrag

    Arrays sollte man schon mit For-Schleife durchgehen.
    In dieser Variante spart man den Array-Include.
    Oder nimm die Variante aus meiner Signatur (1D u. 2D).

    Spoiler anzeigen
    [autoit]

    Func _ArrayDeleteEmpty(ByRef $ARRAY)
    If Not IsArray($ARRAY) Then Return 0
    Local $arTMP[1]
    For $i = 0 To UBound($ARRAY) -1
    If $ARRAY[$i] <> '' Then
    If $arTMP[0] = '' Then
    $arTMP[0] = $ARRAY[$i]
    Else
    ReDim $arTMP[UBound($arTMP)+1]
    $arTMP[UBound($arTMP)-1] = $ARRAY[$i]
    EndIf
    EndIf
    Next
    $ARRAY = $arTMP
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Hallo,

    warum sollte man ein Array mit einer For-Schleife durchgehen, ich bin der Meinung man sollte der Schleife den Vorzug geben die am effektivsten ist. Man muss ja nur darauf achten das man nicht über das Ende des Array's hinausschießt.

    Auf meinem Notebook (P4 2,2GHz) ist die While-Schleife ca. um den Faktor 5 schneller als die For-Schleife:

    Spoiler anzeigen
    [autoit]


    #include <array.au3>

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

    $Text = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

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

    Dim $RandomArray[10000]
    For $i = 0 To UBound($RandomArray) - 1
    $RandomArray[$i] = StringLeft($Text,Random(0,StringLen($Text),1))
    Next

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

    $TestStringFor = $RandomArray
    $TestStringWhile = $RandomArray

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

    $Start = TimerInit()
    _ArrayDeleteEmptyFor($TestStringFor)
    $TimeFor = TimerDiff($Start)

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

    $Start = TimerInit()
    _ArrayDeleteEmptyWhile($TestStringWhile)
    $TimeWhile = TimerDiff($Start)

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

    MsgBox(0,"", "Laufzeit For-Schleife: " & Int($TimeFor) & " ms" & @CRLF & "Laufzeit While-Schleife: " & Int($TimeWhile) & " ms")

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

    Func _ArrayDeleteEmptyFor(ByRef $ARRAY)
    If Not IsArray($ARRAY) Then Return 0
    Local $arTMP[1]
    For $i = 0 To UBound($ARRAY) - 1
    If $ARRAY[$i] <> '' Then
    If $arTMP[0] = '' Then
    $arTMP[0] = $ARRAY[$i]
    Else
    ReDim $arTMP[UBound($arTMP)+1]
    $arTMP[UBound($arTMP)-1] = $ARRAY[$i]
    EndIf
    EndIf
    Next
    $ARRAY = $arTMP
    EndFunc

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

    Func _ArrayDeleteEmptyWhile(ByRef $ARRAY)
    Local $index = 0

    If Not IsArray($ARRAY) Then Return 0
    While 1
    If $index > UBound($ARRAY) - 1 Then ExitLoop
    If StringIsSpace($ARRAY[$index]) Or $ARRAY[$index] = "" Then
    _ArrayDelete($ARRAY,$index)
    ContinueLoop
    EndIf
    $index += 1
    WEnd

    EndFunc

    [/autoit]