hilfe pfad sortieren klappt nicht

  • Hallo miteinenader ich han ein kleines problem mit dem sortieren von einträgen, vielleicht könnt ihr mir helfen

    ich will einen ordner einlesen wo sich die neueste installations cds für meine programme befinden, anschließen eine install.ini erzeugen wo die pfade
    nach datum sortiert sich befinden - leider klappt bei mir das sortieren nicht

    hier mien script

    ; Shows the Folder Names of all Folders in the directory


    [autoit]


    #include <File.au3>
    #include <String.au3>
    #include <Array.au3>
    #include <GUIConstants.au3>

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

    $search = FileFindFirstFile("...\CDs\_AktuelleDVDs\*")

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

    ; Check if the search was successful
    If $search = -1 Then
    MsgBox(0, "Error", "No files/directories matched the search pattern")
    Exit
    EndIf

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

    While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop

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

    $file1 = FileOpen("test.txt", 1)

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

    ; Check if file opened for writing OK
    If $file1 = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf

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

    FileWrite($file1, "["&$file &"]"&@CRLF) ;-- cd from Date/ datum ....
    FileWrite($file1, "pfad=CDs\_AktuelleDVDs\"& $file & "\install.exe" & @CRLF) ; pfad - cd from Date/ datum ...

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

    ;~ write the data to textfile
    FileClose($file1)
    WEnd

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

    FileClose($search)

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

    Dim $array

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

    ;- array
    If _FileReadToArray ("Test.txt", $Array) = 0 Then
    Exit
    EndIf

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

    $array[0] = '' ; löscht erste zeile (delete raw counter)

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

    _FileWriteFromArray(@ScriptDir & "\install.ini",$array,0) ; output

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

    FileDelete(@ScriptDir & "\Test.txt")

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

    ;- Run("notepad.exe " & @ScriptDir & "\install.ini")

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


    ausgabe:


    [DVDpro4.0P_02.10.2009_DVD1]
    pfad=\CDs\_AktuelleDVDs\DVDpro4.0P_02.10.2009_DVD1\install.exe
    [DVDpro3.9P_06.10.2009]
    pfad=\CDs\_AktuelleDVDs\DVDpro3.9P_06.10.2009\install.exe
    [DVDpro3.9P_05.10.2009]
    pfad=\CDs\_AktuelleDVDs\DVDpro3.9P_05.10.2009\install.exe
    [DVDpro4.0P_02.10.2009_DVD2]
    pfad=\CDs\_AktuelleDVDs\DVDpro4.0P_02.10.2009_DVD2\install.exe
    [DVDpro3.9P_02.10.2009]
    pfad=\CDs\_AktuelleDVDs\DVDpro3.9P_02.10.2009\install.exe
    [DVD38pro_05.10.2009]
    pfad=\CDs\_AktuelleDVDs\DVD38pro_05.10.2009\install.exe
    [DVD38pro_06.10.2009]
    pfad=\CDs\_AktuelleDVDs\DVD38pro_06.10.2009\install.exe
    [DVD38pro_02.10.2009]
    pfad=\CDs\_AktuelleDVDs\DVD38pro_02.10.2009\install.exe
    [DVD38pro_01.10.2009]
    pfad=\CDs\_AktuelleDVDs\DVD38pro_01.10.2009\install.exe
    [DVDpro3.9P_01.10.2009]
    pfad=\CDs\_AktuelleDVDs\DVDpro3.9P_01.10.2009\install.exe

    ich bräuchte es aber nach dvd und dann datum sortiert


    sollte so aussehen:


    [DVDpro4.0P_02.10.2009_DVD1]
    pfad=\CDs\_AktuelleDVDs\DVDpro4.0P_02.10.2009_DVD1\install.exe

    [DVDpro4.0P_02.10.2009_DVD2]
    pfad=\CDs\_AktuelleDVDs\DVDpro4.0P_02.10.2009_DVD2\install.exe

    [DVDpro3.9P_06.10.2009]
    pfad=\CDs\_AktuelleDVDs\DVDpro3.9P_06.10.2009\install.exe

    [DVDpro3.9P_05.10.2009]
    pfad=\CDs\_AktuelleDVDs\DVDpro3.9P_05.10.2009\install.exe

    [DVDpro3.9P_02.10.2009]
    pfad=\CDs\_AktuelleDVDs\DVDpro3.9P_02.10.2009\install.exe

    [DVD38pro_06.10.2009]
    pfad=\CDs\_AktuelleDVDs\DVD38pro_06.10.2009\install.exe

    [DVD38pro_05.10.2009]
    pfad=\CDs\_AktuelleDVDs\DVD38pro_05.10.2009\install.exe

    [DVD38pro_02.10.2009]
    pfad=\CDs\_AktuelleDVDs\DVD38pro_02.10.2009\install.exe

    was mach ich falsch ????

    Einmal editiert, zuletzt von doni_darco (9. Oktober 2009 um 10:39)

  • Hi,

    probier mal das:

    [autoit]

    #include <File.au3>
    #include <String.au3>
    #include <Array.au3>
    #include <GUIConstants.au3>

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

    $search = FileFindFirstFile("...\CDs\_AktuelleDVDs\*")

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

    ; Check if the search was successful
    If $search = -1 Then
    MsgBox(0, "Error", "No files/directories matched the search pattern")
    Exit
    EndIf

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

    While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop

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

    $file1 = FileOpen("test.txt", 1)

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

    ; Check if file opened for writing OK
    If $file1 = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf

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

    ;FileWrite($file1, "["&$file &"]"&@CRLF) ;-- cd from Date/ datum .... Änderung, s. For Loop unten
    FileWrite($file1, "pfad=CDs\_AktuelleDVDs\"& $file & "\install.exe" & @CRLF) ; pfad - cd from Date/ datum ...

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

    ;~ write the data to textfile
    FileClose($file1)
    WEnd

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

    FileClose($search)

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

    Dim $array

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

    ;- array
    If _FileReadToArray ("Test.txt", $array) = 0 Then
    Exit
    EndIf

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

    $array[0] = '' ; löscht erste zeile (delete raw counter)
    ;_ArrayDelete ($array, 0)
    _ArraySort ($array, 1)
    ;_FileWriteFromArray(@ScriptDir & "\install.ini",$array,0) ; output
    $file = FileOpen (@ScriptDir & "\install.ini", 2)
    For $i = 0 To UBound ($array) - 1
    If $array [$i] = "" Then ContinueLoop
    $tempstring = StringSplit ($array [$i], "\")
    FileWriteLine ($file, "[" & $tempstring [$tempstring [0] - 1] & "]")
    FileWriteLine ($file, $array [$i])
    Next
    FileClose ($file)
    FileDelete(@ScriptDir & "\Test.txt")

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

    ;- Run("notepad.exe " & @ScriptDir & "\install.ini")

    [/autoit]

    ;-))
    Stefan

    Edit: ) und StringSplit Parameter ergänzt!!! _ArraySort Aufruf angepasst

    4 Mal editiert, zuletzt von ojo (6. Oktober 2009 um 15:42)

  • Super klappt aber ein kleines problem hab ich noch
    wie kann ich es so sortieren das dvd 1 oben steht in moment würde dvd 2 oben stehen :/

    Einmal editiert, zuletzt von doni_darco (8. Oktober 2009 um 10:58)

  • Huh,

    das ist ein Problem und erst einmal so nicht zu lösen:

    1) Komisch: wenn ich für die Verz. DVD1_pro4.0P_02.10.2009 nehme dann sortiert er richtig.
    2) Für Dich als Workaround ein _ArraySwap ($array [0], $array [1]) nach der Sortierung oder gffs. Verz. Struktur anpassen.

    ;-((
    Stefan

  • Hallo doni_darco,

    hier ein Skript dass die Files in ein 2D-Array einliest

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <String.au3>
    #include <Array.au3>
    #include <GUIConstants.au3>

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

    Dim $arFiles[1][2]

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

    #cs ;<=============== wieder aktivieren

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

    $search = FileFindFirstFile("C:\Dokumente und Einstellungen\All Users\Dokumente\downloads\FNWeb\*.pdf")

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

    ; Check if the search was successful
    If $search = -1 Then
    MsgBox(0, "Error", "No files/directories matched the search pattern")
    Exit
    EndIf

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

    $i = 0
    While 1

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

    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    $i= $i + 1
    _ArrayAdd($arFiles,$file)
    _createDateStr($arFiles[$i][0],$i)
    WEnd

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

    FileClose($search)

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

    #ce

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

    ;zum Testen eingefügt wieder löschen
    Dim $arFiles[11][2]
    $arFiles[1][0] = 'DVDpro4.0P_02.10.2009_DVD1'
    $arFiles[2][0] = 'DVDpro3.9P_06.10.2009'
    $arFiles[3][0] = 'DVDpro3.9P_05.10.2009'
    $arFiles[4][0] = 'DVDpro4.0P_02.10.2009_DVD2'
    $arFiles[5][0] = 'DVDpro3.9P_02.10.2009'
    $arFiles[6][0] = 'DVD38pro_05.10.2009'
    $arFiles[7][0] = 'DVD38pro_06.10.2009'
    $arFiles[8][0] = 'DVD38pro_02.10.2009'
    $arFiles[9][0] = 'DVD38pro_01.10.2009'
    $arFiles[10][0] = 'DVDpro3.9P_01.10.2009'
    _ArrayDisplay($arFiles)

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

    For $i = 1 To 10 ;UBound($arFiles)
    _createDateStr($arFiles[$i][0], $i)
    Next
    ;bis hier hier

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

    Func _createDateStr($FileName, $ai)
    Local $pos, $sVergleich = $FileName, $iCount
    StringReplace($FileName, ".", ".")
    $iCount = @extended
    Switch $iCount
    Case 3
    $pos = StringInStr($FileName, ".", 0, 2)
    Case 2
    $pos = StringInStr($FileName, ".", 0, 1)
    EndSwitch
    ConsoleWrite($i & " Count: " & $iCount & " pos: " & $pos & @CRLF)
    $iTag = StringMid($FileName, $pos - 2, 2)
    $iMonat = StringMid($FileName, $pos + 1, 2)
    $iJahr = StringMid($FileName, $pos + 4, 4)
    $iNr = StringMid($FileName, $pos + 8, 99)
    $arFiles[$ai][1] = $iJahr & $iMonat & $iTag & $iNr
    EndFunc ;==>_createDateStr
    _ArraySort($arFiles, 0, 0, 0, 1)
    _ArrayDisplay($arFiles)

    [/autoit]

    Durch die 2 Spalte kann jetzt problemlos ArraySort verwendet werden (ausser du hast noch mehr Ausnahmen, dann musst du diese in _createDateStr noch einfügen)

    mfg (Auto)Bert