Array beabeiten

  • Hallo zusammen,

    nach einem FileListToArray und einem ArraySort schaut das array so aus.

    IMG_123456_A 20071202180000 IMG_123456
    IMG_123456_10 20071205180100 IMG_123456
    IMG_123456_2 20071204175900 IMG_123456
    IMG_123456_1 20071203170000 IMG_123456

    Es soll die Datei mit der höchsten laufenden Nummer gelöscht werden (ist auch immer die aktuellste), also die _10.

    Eine Sortierung nach Datum und Dateinamen (Spalte 1) ergibt das array.

    Mein erster Versuch sollte eigentlich ganz einfach sein (ohne Rücksicht auf Datum und laufende Nummer),deshalb die 3 Spalte mit gekürzten Dateinamen.

    So schaut der erste Code aus, der scheitert und ich weis nicht weiter.

    Spoiler anzeigen
    [autoit]

    For $i = 0 To UBound($n_array)
    If $n_array[$i][2] = $n_array[$i+1][2]
    Then $n_array[$i+1] &= '|'
    If $n_array[$i] = "|" Then
    FileMove($pfad & $n_array[$i] & ".ipg" , $pfad & "Abfalleimer")
    EndIf
    EndIf

    [/autoit]

    Fehlermeldung:

    ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:

    Wo liegt das Problem?

    Danke.

    Bis bald

    leertaste

    Einmal editiert, zuletzt von leertaste (10. Dezember 2007 um 20:01)

  • so schaut der Rest aus....


    [autoit]

    #include <File.au3>
    #include <Array.au3> ;Für ArrayDisplay
    $pfad = @ScriptDir
    $aFiles = _FileListToArray($pfad,"*.jpg")
    If @error = 1 Then
    MsgBox(0, "", "No Files\Folders Found.")
    Exit
    EndIf
    _ArrayDisplay($aFiles,"Ergebnis von FileListToArray")
    Dim $n_array[Ubound($aFiles)][3]
    Dim $entry = 0 ;Aktueller Index des neuen Arrays
    For $i = 1 To $aFiles[0]
    If StringLen($aFiles[$i]) >= 14 Then
    $n_array[$entry][0] = $aFiles[$i]
    $n_array[$entry][1] = FileGetTime($pfad & "\" & $aFiles[$i], 0, 1)
    $n_array[$entry][2] = StringMid($aFiles[$i], 1, 12)
    $entry += 1 ;Index um 1 erhöhen
    EndIf
    Next
    ReDim $n_array[$entry][3]

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

    For $i = 0 To UBound($n_array)
    If $n_array[$i][2] = $n_array[$i+1][2] Then
    $n_array[$i+1] &= '|'
    If $n_array[$i] = "|" Then
    FileMove($pfad & $n_array[$i] & ".ipg" , $pfad & "Abfalleimer")
    EndIf
    EndIf
    Next

    [/autoit]

    leertaste

  • Hi,

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Array.au3> ;Für ArrayDisplay
    $pfad = @ScriptDir
    $aFiles = _FileListToArray($pfad,"*.jpg")
    If @error = 1 Then
    MsgBox(0, "", "No Files\Folders Found.")
    Exit
    EndIf
    _ArrayDisplay($aFiles,"Ergebnis von FileListToArray")
    Dim $n_array[Ubound($aFiles)][3]
    Dim $entry = 0 ;Aktueller Index des neuen Arrays
    For $i = 1 To $aFiles[0]
    If StringLen($aFiles[$i]) >= 14 Then
    $n_array[$entry][0] = $aFiles[$i]
    $n_array[$entry][1] = FileGetTime($pfad & "\" & $aFiles[$i], 0, 1)
    $n_array[$entry][2] = StringMid($aFiles[$i], 1, 12)
    $entry += 1 ;Index um 1 erhöhen
    EndIf
    Next
    _ArrayDisplay($n_array,"2")
    ReDim $n_array[$entry][3]
    _ArrayDisplay($n_array,"2")
    For $i = 0 To UBound($n_array) -2
    If $n_array[$i][2] = $n_array[$i+1][2] Then
    $n_array[$i+1][0] = '|'
    If $n_array[$i][0] = "|" Then
    FileMove($pfad & $n_array[$i][0] & ".ipg" , $pfad & "Abfalleimer")
    EndIf
    EndIf
    Next

    [/autoit]

    Habs mal verbessert, wobei ich nicht weiss ob es so funktioniert wie du willst.

    uBound gibt immer die Anzahl von Einträgen zurück. Mußt du eigentlich noch -1 machen. Hab -2 gemacht, da du die $i ja hochzählst und beim letzten Eintrag ist $i größer als das array.

    Außerdem muß die n_array immer in der selben Dimension lassen (also gleich viele Spalten)

    Einmal hattest du $n_array[$i]

    und einmal $n_array[$i](2]

    Das geht nicht :D

    • Offizieller Beitrag

    Ich habe Dein Script auch mal überarbeitet. Ich habe allerdings nicht so ganz verstanden wozu die untere For...Next-Schleife sein soll.
    Wenn ich Dich richtig verstanden habe, dann willst Du die aktuellste Datei löschen bzw. verschieben. Schau Dir mal das hier an:

    [autoit]


    #include <File.au3>
    #include <Array.au3> ;Für ArrayDisplay
    $pfad = @ScriptDir
    $aFiles = _FileListToArray($pfad,"*.jpg")
    If @error = 1 Then
    MsgBox(0, "", "No Files\Folders Found.")
    Exit
    EndIf
    _ArrayDisplay($aFiles,"Ergebnis von FileListToArray")
    Dim $n_array[$aFiles[0]][3]
    Dim $entry = 0 ;Aktueller Index des neuen Arrays
    For $i = 1 To $aFiles[0]
    If StringLen($aFiles[$i]) >= 14 Then
    $n_array[$entry][0] = $aFiles[$i]
    $n_array[$entry][1] = FileGetTime($pfad & "\" & $aFiles[$i], 0, 1)
    $n_array[$entry][2] = StringMid($aFiles[$i], 1, 12)
    $entry += 1;Index um 1 erhöhen
    EndIf
    Next
    ReDim $n_array[$entry][3]
    _ArraySort($n_array, 1, 0, 0, 3, 1); sortiert das Array nach dem Dateidatum (....,3,1)
    _ArrayDisplay($n_array)
    FileMove($pfad & '\' & $n_array[0][0], $pfad & "\Abfalleimer")

    [/autoit]

    BTW: Beim FileMove fehlte auch jeweils der Backslash.


    Edit: Der AutoIt-Tag geht nicht mehr
    bernd670: Tags gehen wieder!

  • Hab leider nicht so toll beschrieben was ich eigentlich erreichen möchte.

    In einem Verzeichnis sind zig verschiedene Dateien (*.jpg)

    IMG_123456
    IMG_123899
    IMG_123124
    IMG_123428 usw.

    Zu jeder Datei gibt es verschiedene Varianten z.B. zur IMG_123456

    IMG_123456_A
    IMG_123456_10
    IMG_123456_2
    IMG_123456_1

    Es soll nun die jüngste Datei erhalten bleiben, ist auch in der Regel die mit der höchsten laufenden Nr., als die _10. Manchmal habe ich auch mit Buchstaben angefangen und bin dann zu Zahlen übergegangen. Im Zweifelsfalle müsste man das Datum auch noch vergleichen. Dies ist mir aber zum Einstieg noch zu kompliziert.

    Das array sind so aus: Dateiname - Datum - Dateiname ohne laufender Nr.

    Wenn man nun absteigend nach Datum sortiert steht die jüngste Datei oben, bei jedem Dateinamen.

    Alle anderen Dateien einer Familie möchte ich löschen.

    Hoffentlich ist es verständlich.....

    Danke. leertaste

    • Offizieller Beitrag

    Ok, ich hoffe, dass ich Dich diesmal richtig verstanden habe.

    Ich habe das mit Dateien nach Deinem obigen Muster getestet und es funktioniert. :)