Alexxander Posted December 27, 2014 Posted December 27, 2014 Hi I'am trying to list files from folder sorted by name (same as the picture) i tried this code #include <File.au3> $arr = _FileListToArray("D:\2") _ArrayDisplay($arr) i am getting this result Any one could explain why it is putting 10-1 before 8-1 ? how can i make Autoit view file same as windows explorer ?
Jfish Posted December 27, 2014 Posted December 27, 2014 I think the function you are using just puts the files in order from first to last (not sorted). You can try _ArraySort to put them in order. Build your own poker game with AutoIt: pokerlogic.au3 | Learn To Program Using FREE Tools with AutoIt
Alexxander Posted December 27, 2014 Author Posted December 27, 2014 Jfish i tried this #include <File.au3> $arr = _FileListToArray("D:\2") _ArraySort($arr) _ArrayDisplay($arr) this is what i get any other ideas ?
Jfish Posted December 27, 2014 Posted December 27, 2014 (edited) Yes, delete the first value in the array (7) (before sorting) which is the number of files then sort by ascending not descending Edited December 27, 2014 by Jfish Alexxander 1 Build your own poker game with AutoIt: pokerlogic.au3 | Learn To Program Using FREE Tools with AutoIt
Moderators Melba23 Posted December 27, 2014 Moderators Posted December 27, 2014 Alexxander,You need to sort the items numerically - at present you are sorting them as alphabetic strings. Here is how you might go about it:#include <Array.au3> ; Simulate reading files $sList = "8-1.mp3:8-2.mp3:10-2.mp3:8-4.mp3:8-5.mp3:10-1.mp3:8-3.mp3" $aList = StringSplit($sList, ":") _ArrayDisplay($aList, "Unsorted", Default, 8) ; Now create a 2D array... _ArrayColInsert($aList, 1) _ArrayDisplay($aList, "2D", Default, 8) ; ...and set the [1] element to the number For $i = 1 To $aList[0][0] $aList[$i][1] = Number(StringRegExpReplace($aList[$i][0], "[^0-9]", "")) Next _ArrayDisplay($aList, "Number column", Default, 8) ; Now sort the items numerically _ArraySort($aList, 0, 1, 0, 1) _ArrayDisplay($aList, "Numerical Sort", Default, 8) ; And finally remove the number column _ArrayColDelete($aList, 1) _ArrayDisplay($aList, "Final", Default, 8)All clear? M23 Alexxander 1 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
Alexxander Posted December 28, 2014 Author Posted December 28, 2014 (edited) Melba23 thanks bro it is workign fine for all the names that have "-" in them when i have a name without "-" it will not but that number in the right place #include <Array.au3> ; Simulate reading files $sList = "8-1.mp3:8-2.mp3:10-2.mp3:8-4.mp3:8-5.mp3:10-1.mp3:8-3.mp3:16" $aList = StringSplit($sList, ":") _ArrayColInsert($aList, 1) For $i = 1 To $aList[0][0] $aList[$i][1] = Number(StringRegExpReplace($aList[$i][0], "[^0-9]", "")) Next _ArraySort($aList, 0, 1, 0, 1) _ArrayColDelete($aList, 1) _ArrayDisplay($aList, "Final", Default, 8) The code result: 16 must be the last not the first... any ideas ? Edited December 28, 2014 by Alexxander
Moderators Melba23 Posted December 28, 2014 Moderators Posted December 28, 2014 Alexxander,If all the file names are of the form ##[-##] and have the ".mp3" extension (or no extension at all), then change this line: $aList[$i][1] = Number(StringReplace(StringReplace($aList[$i][0], ".mp3", ""), "-", "."))But if there are a mix of extensions or filenames which use other then a "-" to separate the number sections of the name then you will need something more complicated. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
jguinch Posted December 28, 2014 Posted December 28, 2014 (edited) Also, we can add some blanks before each value, to have all strings with the same length (128 for example), and then sort the array : #include <Array.au3> ; Simulate reading files $sList = "8-1.mp3:8-2.mp3:10-2.mp3:8-4.mp3:8-5.mp3:10-1.mp3:8-3.mp3" $aList = StringSplit($sList, ":") _ArrayDisplay($aList, "Unsorted", Default, 8) ; Now create a 2D array... _ArrayColInsert($aList, 1) ; ...and set the [1] element to the number For $i = 1 To $aList[0][0] ; Adds spaces on the left, to have 128 caracters string $aList[$i][1] = StringFormat("%128s", $aList[$i][0] ) Next _ArrayDisplay($aList, "2D", Default, 8) _ArraySort($aList, 0, 0, 0, 1) _ArrayColDelete($aList, 1) _ArrayDisplay($aList, "Number column", Default, 8) Edited December 28, 2014 by jguinch Alexxander 1 Spoiler Network configuration UDF, _DirGetSizeByExtension, _UninstallList Firefox ConfigurationArray multi-dimensions, Printer Management UDF
Alexxander Posted December 28, 2014 Author Posted December 28, 2014 (edited) jguinch & Melba23 thank you fellows but im still having problem in the non dashed names #include <Array.au3> #include <File.au3> ; Simulate reading files ;$sList = "8-1.mp3:8-2.mp3:10-2.mp3:8-4.mp3:8-5.mp3:10-1.mp3:8-3.mp3" ;$aList = StringSplit($sList, ":") $arr = _FileListToArray("D:\2") $aList = StringSplit(_ArrayToString($arr,":"), ":") ;_ArrayDisplay($aList, "Unsorted", Default, 8) ; Now create a 2D array... _ArrayColInsert($aList, 1) ; ...and set the [1] element to the number For $i = 1 To $aList[0][0] ; Adds spaces on the left, to have 128 caracters string $aList[$i][1] = StringFormat("%128s", $aList[$i][0] ) Next ;_ArrayDisplay($aList, "2D", Default, 8) _ArraySort($aList, 0, 0, 0, 1) _ArrayColDelete($aList, 1) _ArrayDisplay($aList, "Number column", Default, 8) result 14.mp3 16.mp3 8-1.mp3 8-2.mp3 10-1.mp3 10-2.mp3 11-1.mp3 11-2.mp3 11-3.mp3 13-2.mp3 13-3.mp3 15-1.mp3 15-2.mp3 it must be like this Im confused about this this thing may some explain what is happening please ? Edited December 28, 2014 by Alexxander
Moderators Melba23 Posted December 28, 2014 Moderators Posted December 28, 2014 Alexxander,It looks as if you want to show only .mp3 files - if that is the case then use the filter parameter of _FileListToArray to only list those files. Then the sort works as you wish: #include <Array.au3> ; Simulate reading files with mp3 extension only $sList = "14.mp3:16.mp3:8-1.mp3:8-2.mp3:10-1.mp3:10-2.mp3:11-1.mp3:11-2.mp3:11-3.mp3:13-2.mp3:13-3.mp3:15-1.mp3:15-2.mp3" $aList = StringSplit($sList, ":") _ArrayColInsert($aList, 1) For $i = 1 To $aList[0][0] $aList[$i][1] = Number(StringReplace(StringReplace($aList[$i][0], ".mp3", ""), "-", ".")) Next _ArraySort($aList, 0, 0, 0, 1) _ArrayColDelete($aList, 1) _ArrayDisplay($aList, "Final", Default, 8)M23 Alexxander 1 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
Alexxander Posted December 28, 2014 Author Posted December 28, 2014 the last code worker perfectly but it made problems when their is a string before the number (sorry about not saying that earlier ) #include <Array.au3> #include <File.au3> ; Simulate reading files with mp3 extension only $arr = _FileListToArray("D:\3") $aList = StringSplit(_ArrayToString($arr,":"), ":") ;$sList = "14.mp3:16.mp3:8-1.mp3:8-2.mp3:10-1.mp3:10-2.mp3:11-1.mp3:11-2.mp3:11-3.mp3:13-2.mp3:13-3.mp3:15-1.mp3:15-2.mp3" ;$aList = StringSplit($sList, ":") _ArrayColInsert($aList, 1) For $i = 1 To $aList[0][0] $aList[$i][1] = Number(StringReplace(StringReplace($aList[$i][0], ".mp3", ""), "-", ".")) Next _ArraySort($aList, 0, 0, 0, 1) _ArrayColDelete($aList, 1) _ArrayDisplay($aList, "Final", Default, 8) the result: ts-almojadilah5-3.mp3 ts-almojadilah6-1.mp3 ts-almojadilah6-2.mp3 ts-almojadilah4-4.mp3 ts-almojadilah4-5.mp3 ts-almojadilah5-1.mp3 ts-almojadilah7-3.mp3 ts-almojadilah7-4.mp3 ts-almojadilah7-5.mp3 ts-almojadilah6-3.mp3 ts-almojadilah7-1.mp3 ts-almojadilah7-2.mp3 ts-almojadilah4-3.mp3 ts-almojadilah2-2.mp3 ts-almojadilah2-3.mp3 ts-almojadilah2-1.mp3 ts-almojadilah1-1.mp3 ts-almojadilah1-2.mp3 ts-almojadilah2-4.mp3 ts-almojadilah4-1.mp3 ts-almojadilah4-2.mp3 ts-almojadilah3-3.mp3 ts-almojadilah3-1.mp3 ts-almojadilah3-2.mp3 24 they must be like this this is my last request please help me bro ...
jguinch Posted December 28, 2014 Posted December 28, 2014 Maybe you can try with Binary instead of Number : #include <Array.au3> ; Simulate reading files with mp3 extension only $sList = "ts-almojadilah5-3.mp3;ts-almojadilah6-1.mp3;ts-almojadilah6-2.mp3;ts-almojadilah4-4.mp3;" & _ "ts-almojadilah4-5.mp3;ts-almojadilah5-1.mp3;ts-almojadilah7-3.mp3;ts-almojadilah7-4.mp3;" & _ "ts-almojadilah7-5.mp3;ts-almojadilah6-3.mp3;ts-almojadilah7-1.mp3;ts-almojadilah7-2.mp3;" & _ "ts-almojadilah4-3.mp3;ts-almojadilah2-2.mp3;ts-almojadilah2-3.mp3;ts-almojadilah2-1.mp3;" & _ "ts-almojadilah1-1.mp3;ts-almojadilah1-2.mp3;ts-almojadilah2-4.mp3;ts-almojadilah4-1.mp3;" & _ "ts-almojadilah4-2.mp3;ts-almojadilah3-3.mp3;ts-almojadilah3-1.mp3;ts-almojadilah3-2.mp3" $aList = StringSplit($sList, ";") _ArrayColInsert($aList, 1) For $i = 1 To $aList[0][0] $aList[$i][1] = Binary(StringReplace(StringReplace($aList[$i][0] , ".mp3", ""), "-", ".")) Next _ArrayDisplay($aList) _ArraySort($aList, 0, 0, 0, 1) _ArrayColDelete($aList, 1) _ArrayDisplay($aList, "Final", Default, 8) Alexxander 1 Spoiler Network configuration UDF, _DirGetSizeByExtension, _UninstallList Firefox ConfigurationArray multi-dimensions, Printer Management UDF
Alexxander Posted December 28, 2014 Author Posted December 28, 2014 (edited) jguinch #include <Array.au3> #include <File.au3> ; Simulate reading files with mp3 extension only ;$sList = "ts-almojadilah5-3.mp3;ts-almojadilah6-1.mp3;ts-almojadilah6-2.mp3;ts-almojadilah4-4.mp3;" & _ ; "ts-almojadilah4-5.mp3;ts-almojadilah5-1.mp3;ts-almojadilah7-3.mp3;ts-almojadilah7-4.mp3;" & _ ; "ts-almojadilah7-5.mp3;ts-almojadilah6-3.mp3;ts-almojadilah7-1.mp3;ts-almojadilah7-2.mp3;" & _ ; "ts-almojadilah4-3.mp3;ts-almojadilah2-2.mp3;ts-almojadilah2-3.mp3;ts-almojadilah2-1.mp3;" & _ ; "ts-almojadilah1-1.mp3;ts-almojadilah1-2.mp3;ts-almojadilah2-4.mp3;ts-almojadilah4-1.mp3;" & _ ; "ts-almojadilah4-2.mp3;ts-almojadilah3-3.mp3;ts-almojadilah3-1.mp3;ts-almojadilah3-2.mp3" ;$aList = StringSplit($sList, ";") $arr = _FileListToArray("D:\5") $aList = StringSplit(_ArrayToString($arr,":"), ":") _ArrayColInsert($aList, 1) For $i = 1 To $aList[0][0] $aList[$i][1] = Binary(StringReplace(StringReplace($aList[$i][0] , ".mp3", ""), "-", ".")) Next ;_ArrayDisplay($aList) _ArraySort($aList, 0, 0, 0, 1) _ArrayColDelete($aList, 1) _ArrayDisplay($aList, "Final", Default, 8) your code works except these 1-1.mp3 1-2.mp3 10-1.mp3 10-3.mp3 2-1.mp3 2-2.mp3 2-3.mp3 2-4.mp3 3-1.mp3 3-2.mp3 3-3.mp3 4-1.mp3 4-2.mp3 4-3.mp3 4-4.mp3 6-1.mp3 6-2.mp3 6-3.mp3 7-1.mp3 7-2.mp3 7-3.mp3 7-4.mp3 7-5.mp3 8-5.mp3 it must be i dont understand why autoit dont just order files like windows or view same in the order that windows is showing them currently !! Edited December 28, 2014 by Alexxander
mikell Posted December 28, 2014 Posted December 28, 2014 (edited) This topic is a long run #include <Array.au3> $sList = "ts-almojadilah5-3.mp3;ts-almojadilah6-1.mp3;ts-almojadilah6-2.mp3;ts-almojadilah4-4.mp3;" & _ "ts-almojadilah4-5.mp3;ts-almojadilah5-1.mp3;ts-almojadilah7-3.mp3;ts-almojadilah7-4.mp3;" & _ "ts-almojadilah7.mp3;ts-almojadilah6-3.mp3;ts-almojadilah7-1.mp3;ts-almojadilah7-2.mp3;" & _ "ts-almojadilah4-3.mp3;ts-almojadilah2-2.mp3;ts-almojadilah2-3.mp3;ts-almojadilah2-1.mp3;" & _ "ts-almojadilah1-1.mp3;ts-almojadilah1-2.mp3;ts-almojadilah2-4.mp3;ts-almojadilah4-1.mp3;" & _ "ts-almojadilah4-2.mp3;ts-almojadilah3-3.mp3;ts-almojadilah3-1.mp3;ts-almojadilah3-2.mp3;" & _ "1-1.mp3;1-2.mp3;15.mp3;10-1.mp3;10-3.mp3;2-1.mp3;2-2.mp3;20-1.mp3;test3.txt" $aList = StringSplit($sList, ";", 2) _ArrayDisplay($aList) _ArrayColInsert($aList, 1) For $i = 0 To UBound($aList)-1 $aList[$i][1] = Execute(StringRegExpReplace($aList[$i][0], _ '(.*?)(\d+)-?(\d+)?(.mp3)', "'$1' & StringFormat('%04i', '$2') & '.$3' & ") & "''") Next _ArraySort($aList, 0, 0, 0, 1) _ArrayColDelete($aList, 1) _ArrayDisplay($aList) Edited December 28, 2014 by mikell Alexxander and jguinch 2
jguinch Posted December 28, 2014 Posted December 28, 2014 #include <Array.au3> ; Simulate reading files with mp3 extension only $sList = "ts-almojadilah5-3.mp3;ts-almojadilah6-1.mp3;ts-almojadilah6-2.mp3;ts-almojadilah4-4.mp3;" & _ "ts-almojadilah4-5.mp3;ts-almojadilah5-1.mp3;ts-almojadilah7-3.mp3;ts-almojadilah7-4.mp3;" & _ "ts-almojadilah7-5.mp3;ts-almojadilah6-3.mp3;ts-almojadilah7-1.mp3;ts-almojadilah7-2.mp3;" & _ "ts-almojadilah4-3.mp3;ts-almojadilah2-2.mp3;ts-almojadilah2-3.mp3;ts-almojadilah2-1.mp3;" & _ "ts-almojadilah1-1.mp3;ts-almojadilah1-2.mp3;ts-almojadilah2-4.mp3;ts-almojadilah4-1.mp3;" & _ "ts-almojadilah4-2.mp3;ts-almojadilah3-3.mp3;ts-almojadilah3-1.mp3;ts-almojadilah3-2.mp3" ; $sList = "1-1.mp3;1-2.mp3;10-1.mp3;10-3.mp3;2-1.mp3;2-2.mp3;2-3.mp3;2-4.mp3;3-1.mp3;3-2.mp3;3-3.mp3;4-1.mp3;4-2.mp3;4-3.mp3;4-4.mp3;6-1.mp3;6-2.mp3;6-3.mp3;7-1.mp3;7-2.mp3;7-3.mp3;7-4.mp3;7-5.mp3;8-5.mp3" $aList = StringSplit($sList, ";") _ArrayColInsert($aList, 1) For $i = 1 To $aList[0][0] $aList[$i][1] = StringReplace($aList[$i][0] , ".mp3", "") $aList[$i][1] = StringReplace($aList[$i][1], "-", ".") If NOT StringRegExp( $aList[$i][1], "\d+\.\d+$") Then $aList[$i][1] &= ".0" $aList[$i][1] = StringFormat( "%128s", $aList[$i][1]) Next ; _ArrayDisplay($aList) _ArraySort($aList, 0, 0, 0, 1) _ArrayColDelete($aList, 1) _ArrayDisplay($aList, "Final", Default, 8) Alexxander 1 Spoiler Network configuration UDF, _DirGetSizeByExtension, _UninstallList Firefox ConfigurationArray multi-dimensions, Printer Management UDF
Alexxander Posted December 29, 2014 Author Posted December 29, 2014 (edited) mikell #include <Array.au3> #include <File.au3> ;$sList = "ts-almojadilah5-3.mp3;ts-almojadilah6-1.mp3;ts-almojadilah6-2.mp3;ts-almojadilah4-4.mp3;" & _ ;"ts-almojadilah4-5.mp3;ts-almojadilah5-1.mp3;ts-almojadilah7-3.mp3;ts-almojadilah7-4.mp3;" & _ ;"ts-almojadilah7.mp3;ts-almojadilah6-3.mp3;ts-almojadilah7-1.mp3;ts-almojadilah7-2.mp3;" & _ ; "ts-almojadilah4-3.mp3;ts-almojadilah2-2.mp3;ts-almojadilah2-3.mp3;ts-almojadilah2-1.mp3;" & _ ;"ts-almojadilah1-1.mp3;ts-almojadilah1-2.mp3;ts-almojadilah2-4.mp3;ts-almojadilah4-1.mp3;" & _ ; "ts-almojadilah4-2.mp3;ts-almojadilah3-3.mp3;ts-almojadilah3-1.mp3;ts-almojadilah3-2.mp3;" & _ ;"1-1.mp3;1-2.mp3;15.mp3;10-1.mp3;10-3.mp3;2-1.mp3;2-2.mp3;20-1.mp3;test3.txt" $arr = _FileListToArray("D:\2") $aList = StringSplit(_ArrayToString($arr,";"), ";",2) ;$aList = StringSplit($sList, ";", 2) ;_ArrayDisplay($aList) _ArrayColInsert($aList, 1) For $i = 0 To UBound($aList)-1 $aList[$i][1] = Execute(StringRegExpReplace($aList[$i][0], _ '(.*?)(\d+)-?(\d+)?(.mp3)', "'$1' & StringFormat('%04i', '$2') & '.$3' & ") & "''") Next _ArraySort($aList, 0, 0, 0, 1) _ArrayColDelete($aList, 1) _ArrayDisplay($aList) every thing is working except for these files result 282-1.mp3 282-10.mp3 282-11.mp3 282-12.mp3 282-13.mp3 282-14.mp3 282-15.mp3 282-2.mp3 282-3.mp3 282-4.mp3 282-5.mp3 282-6.mp3 282-7.mp3 282-8.mp3 282-9.mp3 -------------------------------------------------------------------------- jguinch #include <Array.au3> #include <File.au3> ; Simulate reading files with mp3 extension only ;$sList = "ts-almojadilah5-3.mp3;ts-almojadilah6-1.mp3;ts-almojadilah6-2.mp3;ts-almojadilah4-4.mp3;" & _ ; "ts-almojadilah4-5.mp3;ts-almojadilah5-1.mp3;ts-almojadilah7-3.mp3;ts-almojadilah7-4.mp3;" & _ ;; "ts-almojadilah7-5.mp3;ts-almojadilah6-3.mp3;ts-almojadilah7-1.mp3;ts-almojadilah7-2.mp3;" & _ ; "ts-almojadilah4-3.mp3;ts-almojadilah2-2.mp3;ts-almojadilah2-3.mp3;ts-almojadilah2-1.mp3;" & _ ; "ts-almojadilah1-1.mp3;ts-almojadilah1-2.mp3;ts-almojadilah2-4.mp3;ts-almojadilah4-1.mp3;" & _ ; "ts-almojadilah4-2.mp3;ts-almojadilah3-3.mp3;ts-almojadilah3-1.mp3;ts-almojadilah3-2.mp3" ; $sList = "1-1.mp3;1-2.mp3;10-1.mp3;10-3.mp3;2-1.mp3;2-2.mp3;2-3.mp3;2-4.mp3;3-1.mp3;3-2.mp3;3-3.mp3;4-1.mp3;4-2.mp3;4-3.mp3;4-4.mp3;6-1.mp3;6-2.mp3;6-3.mp3;7-1.mp3;7-2.mp3;7-3.mp3;7-4.mp3;7-5.mp3;8-5.mp3" ;$aList = StringSplit($sList, ";") $arr = _FileListToArray("D:6") $aList = StringSplit(_ArrayToString($arr,";"), ";",2) _ArrayColInsert($aList, 1) For $i = 1 To $aList[0][0] $aList[$i][1] = StringReplace($aList[$i][0] , ".mp3", "") $aList[$i][1] = StringReplace($aList[$i][1], "-", ".") If NOT StringRegExp( $aList[$i][1], "d+.d+$") Then $aList[$i][1] &= ".0" $aList[$i][1] = StringFormat( "%128s", $aList[$i][1]) Next ; _ArrayDisplay($aList) _ArraySort($aList, 0, 0, 0, 1) _ArrayColDelete($aList, 1) _ArrayDisplay($aList, "Final", Default, 8) working except these result 282-9.mp3 283-1.mp3 283-2.mp3 283-3.mp3 283-4.mp3 283-5.mp3 282-10.mp3 282-11.mp3 282-12.mp3 282-13.mp3 282-14.mp3 282-15.mp3 i think i'am the most sticky member in this forum Edited December 29, 2014 by Alexxander
mikell Posted December 29, 2014 Posted December 29, 2014 #include <Array.au3> $sList = "ts-almojadilah5-3.mp3;ts-almojadilah6-1.mp3;ts-almojadilah6-2.mp3;ts-almojadilah4-4.mp3;" & _ "ts-almojadilah4-5.mp3;ts-almojadilah5-1.mp3;ts-almojadilah7-3.mp3;ts-almojadilah7-4.mp3;" & _ "ts-almojadilah5.mp3;ts-almojadilah6-3.mp3;ts-almojadilah7-1.mp3;ts-almojadilah7-2.mp3;" & _ "ts-almojadilah4-3.mp3;ts-almojadilah2-2.mp3;ts-almojadilah2-3.mp3;ts-almojadilah2-1.mp3;" & _ "ts-almojadilah1-1.mp3;ts-almojadilah1-2.mp3;ts-almojadilah2-4.mp3;ts-almojadilah4-1.mp3;" & _ "ts-almojadilah4-2.mp3;ts-almojadilah3-3.mp3;ts-almojadilah3-1.mp3;ts-almojadilah3-2.mp3;" & _ "1-1.mp3;1-2.mp3;15.mp3;10-1.mp3;10-3.mp3;2-1.mp3;2-2.mp3;20-1.mp3;test3.txt;" & _ "282-1.mp3;282-10.mp3;283.mp3;282-11.mp3;282-5.mp3;283-5.mp3;283-10.mp3" $aList = StringSplit($sList, ";", 2) _ArrayDisplay($aList) _ArrayColInsert($aList, 1) For $i = 0 To UBound($aList)-1 $aList[$i][1] = Execute(StringRegExpReplace($aList[$i][0], '(.*?)(\d+)-?(\d+)?(.mp3)', _ "'$1' & StringFormat('%04i', '$2') & '.' & StringFormat('%04i', '$3') & ") & "''") Next _ArraySort($aList, 0, 0, 0, 1) _ArrayColDelete($aList, 1) _ArrayDisplay($aList)
Alexxander Posted December 31, 2014 Author Posted December 31, 2014 non of the above was 100% right every code has a bug i ended using php natural sorting and and windows php to complete the job but thanks you a lot to every one who tried and thanks to this awesome scripting language and forum
czardas Posted January 1, 2015 Posted January 1, 2015 (edited) Alexxander - The last post by mikell works on the given strings which contain digits. The specific implementation has limitations, but it's a good example of how to solve this kind of problem. A better way (for an unknown sample) would be to get the length of the longest string of digits within the sample and then prefix the required number of zeros to all instances of numeric strings accordingly. Strings not containing digits should probably be included in the sort - only without modification. Edited January 1, 2015 by czardas operator64 ArrayWorkshop
Malkey Posted January 1, 2015 Posted January 1, 2015 The _ArrayMultiSort function is only used in the example to separate the "txt" files out from between the "mp3" files. I had it from years past, and it did the job.The interesting thing is the ways of sorting all the numbers that are separated by "-".1/ Sort as two individual numbers: or,2/ Sort the numbers as though the second number is the decimal part of the first number.These two sorting order results can differ.expandcollapse popup#include <Array.au3> $sList = "ts-almojadilah5-3a.mp3;ts-almojadilah5-3b.mp3;ts-almojadilah6-1.mp3;ts-almojadilah6-2.mp3;ts-almojadilah4-4.mp3;" & _ "ts-almojadilah4-5.mp3;ts-almojadilah5-1.mp3;ts-almojadilah7-3.mp3;ts-almojadilah7-4.mp3;" & _ "ts-almojadilah5.mp3;ts-almojadilah6-3.mp3;ts-almojadilah7-1.mp3;ts-almojadilah7-2.mp3;" & _ "ts-almojadilah4-3.mp3;ts-almojadilah22-2.mp3;ts-almojadilah42-3.mp3;ts-almojadilah12-1.mp3;" & _ "ts-almojadilah1-1.mp3;ts-almojadilah1-2.mp3;ts-almojadilah2-4.mp3;ts-almojadilah4-1.mp3;" & _ "ts-almojadilah4-2.mp3;ts-almojadilah3-3.mp3;ts-almojadilah3-1.mp3;ts-almojadilah3-2.mp3;" & _ "1-1.mp3;1-2.mp3;15.mp3;10-1.mp3;test22.txt;10-3.mp3;2-1.mp3;2-2.mp3;20-1.mp3;test3.txt;" & _ "282-01.mp3;283.mp3;test14.txt;282-5.mp3;282-1.mp3;282-10.mp3;282-11.mp3;282-12.mp3;282-13.mp3;" & _ "282-14.mp3;282-15.mp3;282-2.mp3;282-3.mp3;282-4.mp3;282-5.mp3;282-6.mp3;282-7.mp3;282-8.mp3;" & _ "282-9.mp3;283-1.mp3;283-2.mp3;283-3.mp3;283-4.mp3;283-5.mp3" Local $fDeciminalSort = 0 ; When "0", the two numbers separated by "-" are treated as two separate numbers. ; When not equal to "0", the number after "-" is treated as the decimal part of the first number. $aList = StringSplit($sList, ";", 2) _ArrayDisplay($aList) _ArrayColInsert($aList, 1) _ArrayColInsert($aList, 2) For $i = 0 To UBound($aList) - 1 If $fDeciminalSort = 0 Then $aList[$i][1] = Execute(StringRegExpReplace($aList[$i][0], '(.*?)(\d+)-?(\d+)?(.*)(\..+)?$', _ "StringFormat('%s%04i_%04i%s', '$1', '$2', '$3', '$4') & ") & "''") Else $aList[$i][1] = Execute(StringRegExpReplace($aList[$i][0], '(.*?)(\d+)-?(\d+)?(.*)(\..+)?$', _ "StringFormat('%s%04i.%s%s', '$1', '$2', Stringleft( '$3' & '0000', 4), '$4') & ") & "''") EndIf $aList[$i][2] = StringRegExpReplace($aList[$i][0], '(^.+\.)', "") ; File extension column Next _ArrayDisplay($aList) _ArrayMultiSort($aList, "2a,1a") ; First sort column 2, ascending (file extensions). Then sort column 1, ascending. Column 0 is thus sorted accordingly. _ArrayDisplay($aList) _ArrayColDelete($aList, 1) _ArrayColDelete($aList, 1) _ArrayDisplay($aList) ; #FUNCTION# ==================================================================================================================== ; Name...........: _ArrayMultiSort ; Description ...: Sort a 1D or, sort a 2D array with the ability to specify which columns to sort and which direction to sort for each column. ; Syntax.........: _ArrayMultiSort(ByRef $avArray[, $sSort = '0d'[, $iStartRow = 0[, $iEndRow = 0]]]) ; Parameters ....: $avArray - Array to sort ; $sSort - [optional] The default setting only sorts the first column, column 0, in decending order. Otherwise, $sSort is ; a string made up of the column sorting order and sort direction for that column. Each column and direction is ; separated by a coma. If sort direction is "a" then that column sorts in ascending order. If no "a" is present ; that column is sorted in a default descending order. ; e.g. "1, 2a,0d" means - First sort column 1 in decending order, then sort column 2 in ascending order, then ; sort column 0 in decending order. ; $iStartRow - [optional] Row index of array to start sorting at ; $iEndRow - [optional] Row index of array to stop sorting at ; Return values .: Success - 1 ; Failure - 0, sets @error: ; |1 - $avArray is not an array ; |2 - $iStart is greater than $iEnd ; |3 - $iSubItem is greater than subitem count ; |4 - $avArray has too many dimensions ; Author ........: Malkey ; Modified.......: ; Remarks .......: Thanks to Bowmore for his example @ http://www.autoitscript.com/forum/topic/98071-array-multi-column-sort/#entry705519 ; This function requires the __TestExp function, and #Include <Array.au3> ; Related .......: ; Link ..........: ; Example .......: Yes ; =============================================================================================================================== Func _ArrayMultiSort(ByRef $aArray, $sSort = '0d', $iStartRow = 0, $iEndRow = 0) Local $iCol1, $Dir, $iLastRow, $iRetV, $Err, $aSort2D[1][2] = [["", 1]] ;---- $sSort (string) to $aSort2D (array) routine ----------- Local $aSort = StringSplit(StringStripWS($sSort, 8), ",", 2) While UBound($aSort) > UBound($aArray, 2) ; Reduce number of column sorts in $aSort to equal number of columns in $aArray if necessary. _ArrayDelete($aSort, UBound($aSort)) WEnd If IsArray($aSort) Then Local $aSort2D[UBound($aSort)][2] For $i = 0 To UBound($aSort2D) - 1 $aSort2D[$i][0] = StringRegExpReplace($aSort[$i], "[^0-9]", "") ; $aSort2D[n][0] for column number $aSort2D[$i][1] = 0 ; $aSort2D[n][1] for sort direction. If StringCompare(StringRegExpReplace($aSort[$i], "(?i)([^a])", ""), "a", 0) <> 0 Then $aSort2D[$i][1] = 1 ; 1 - decending Next EndIf ;_ArrayDisplay($aSort2D) ; ------------------------------------------------------------ If $iEndRow = 0 Or ($iEndRow > (UBound($aArray) - 1)) Then $iLastRow = UBound($aArray) - 1 Local $iStart = -1 Local $iEnd = -1 ; Check if 1D array and "a" is present, then sort ascendingly. If IsArray($aSort) = 0 And StringCompare(StringRegExpReplace($sSort, "(?i)([^a]*)", ""), "a", 0) = 0 Then $aSort2D[0][1] = 0 ; 0 - ascending ; Sort the first column to be sorted. $iRetV = _ArraySort($aArray, $aSort2D[0][1], $iStartRow, $iEndRow, $aSort2D[0][0]); Sort on the first column (stored in $aSort2D[0][0]) $Err = @error If IsArray($aSort) = 0 Then Return SetError(0, $Err, $iRetV) ; Sort all remaining columns. For $j = 1 To UBound($aSort) - 1 If $aSort2D[$j][0] >= 0 Then ; For each group of equal values in the previous sorted column, sort the present column values on the same rows of each group. $iStart = -1 For $i = $iStartRow To $iLastRow Switch $i Case $iStartRow If $i <> $iLastRow Then If __TestExp($aArray, $aSort2D, $i, $j) Then $iStart = $i + 1 $iEnd = $i + 1 Else $iStart = $i $iEnd = $i + 1 EndIf EndIf Case $iLastRow $iEnd = $iLastRow If $iStart <> $iEnd Then $iRetV = _ArraySort($aArray, $aSort2D[$j][1], $iStart, $iEnd, $aSort2D[$j][0]) $Err = @error EndIf Case Else If __TestExp($aArray, $aSort2D, $i, $j) Then $iEnd = $i If $iStart <> $iEnd Then $iRetV = _ArraySort($aArray, $aSort2D[$j][1], $iStart, $iEnd, $aSort2D[$j][0]) $Err = @error EndIf $iStart = $i + 1 $iEnd = $iStart Else $iEnd = $i EndIf EndSwitch Next EndIf Next Return SetError(0, $Err, $iRetV) EndFunc ;==>_ArrayMultiSort ; Internally function used by _ArrayMultiSort() function ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name...........: __TestExp ; Description ...: Creates and tests a test expression. ; Syntax.........: __TestExp($aA, $aC, $k, $m) ; Parameters ....: $aA - The 2D array to be sorted. ; $aC - A 2D array containing to column sorting order and each column's direction of sorting. ; $k - The array's row index of the data being sorted. ; &m - The array's row index of the current column being sorted ; Return values .: 1 - When any of the created test expressions are true; or, ; 0 - When all of the created test expressions are false. ; Author ........: Malkey ; Modified.......: ; Remarks .......: This function is used internally by the _ArrayMultiSort function. The created expression tests the particular ; row, $k, of the test data, for each previously sorted column, $m -1, wheather the value in that column, $aA[$k][$aC[$w][0]], ; is not equal to the next value in that same column, $aA[$k + 1][$aC[$w][0]], where $aC[$w][0] contains the previously sorted column number. ; Related .......: ; Link ..........: ; Example .......: ; =============================================================================================================================== Func __TestExp(ByRef $aA, ByRef $aC, $k, $m) For $w = 0 To $m - 1 ;ConsoleWrite("$aA[" & $k+1 & "][$aC[" & $w& "][0]] <> $aA[" & $k & "][$aC[" & $w & "][0]]" & @LF) If $aA[$k + 1][$aC[$w][0]] <> $aA[$k][$aC[$w][0]] Then ; Like an "Or" join statements. If just one of the expressions in the For-Next loop is true, then function returns "1" (True). Return 1 EndIf Next ;ConsoleWrite( @LF) Return 0 EndFunc ;==>__TestExpClick Show button to see results.Unsorted Data:-ts-almojadilah5-3a.mp3ts-almojadilah5-3b.mp3ts-almojadilah6-1.mp3ts-almojadilah6-2.mp3ts-almojadilah4-4.mp3ts-almojadilah4-5.mp3ts-almojadilah5-1.mp3ts-almojadilah7-3.mp3ts-almojadilah7-4.mp3ts-almojadilah5.mp3ts-almojadilah6-3.mp3ts-almojadilah7-1.mp3ts-almojadilah7-2.mp3ts-almojadilah4-3.mp3ts-almojadilah22-2.mp3ts-almojadilah42-3.mp3ts-almojadilah12-1.mp3ts-almojadilah1-1.mp3ts-almojadilah1-2.mp3ts-almojadilah2-4.mp3ts-almojadilah4-1.mp3ts-almojadilah4-2.mp3ts-almojadilah3-3.mp3ts-almojadilah3-1.mp3ts-almojadilah3-2.mp31-1.mp31-2.mp315.mp310-1.mp3test22.txt10-3.mp32-1.mp32-2.mp320-1.mp3test3.txt282-01.mp3283.mp3test14.txt282-5.mp3282-1.mp3282-10.mp3282-11.mp3282-12.mp3282-13.mp3282-14.mp3282-15.mp3282-2.mp3282-3.mp3282-4.mp3282-5.mp3282-6.mp3282-7.mp3282-8.mp3282-9.mp3283-1.mp3283-2.mp3283-3.mp3283-4.mp3283-5.mp3Sorted when $fDeciminalSort = 0 (like two separate numbers):-1-1.mp31-2.mp32-1.mp32-2.mp310-1.mp310-3.mp315.mp320-1.mp3282-01.mp3282-1.mp3282-2.mp3282-3.mp3282-4.mp3282-5.mp3282-5.mp3282-6.mp3282-7.mp3282-8.mp3282-9.mp3282-10.mp3282-11.mp3282-12.mp3282-13.mp3282-14.mp3282-15.mp3283.mp3283-1.mp3283-2.mp3283-3.mp3283-4.mp3283-5.mp3ts-almojadilah1-1.mp3ts-almojadilah1-2.mp3ts-almojadilah2-4.mp3ts-almojadilah3-1.mp3ts-almojadilah3-2.mp3ts-almojadilah3-3.mp3ts-almojadilah4-1.mp3ts-almojadilah4-2.mp3ts-almojadilah4-3.mp3ts-almojadilah4-4.mp3ts-almojadilah4-5.mp3ts-almojadilah5.mp3ts-almojadilah5-1.mp3ts-almojadilah5-3a.mp3ts-almojadilah5-3b.mp3ts-almojadilah6-1.mp3ts-almojadilah6-2.mp3ts-almojadilah6-3.mp3ts-almojadilah7-1.mp3ts-almojadilah7-2.mp3ts-almojadilah7-3.mp3ts-almojadilah7-4.mp3ts-almojadilah12-1.mp3ts-almojadilah22-2.mp3ts-almojadilah42-3.mp3test3.txttest14.txttest22.txtSorted when $fDeciminalSort = 1 (like a decimal) :-1-1.mp31-2.mp32-1.mp32-2.mp310-1.mp310-3.mp315.mp320-1.mp3282-01.mp3282-1.mp3282-10.mp3282-11.mp3282-12.mp3282-13.mp3282-14.mp3282-15.mp3282-2.mp3282-3.mp3282-4.mp3282-5.mp3282-5.mp3282-6.mp3282-7.mp3282-8.mp3282-9.mp3283.mp3283-1.mp3283-2.mp3283-3.mp3283-4.mp3283-5.mp3ts-almojadilah1-1.mp3ts-almojadilah1-2.mp3ts-almojadilah2-4.mp3ts-almojadilah3-1.mp3ts-almojadilah3-2.mp3ts-almojadilah3-3.mp3ts-almojadilah4-1.mp3ts-almojadilah4-2.mp3ts-almojadilah4-3.mp3ts-almojadilah4-4.mp3ts-almojadilah4-5.mp3ts-almojadilah5.mp3ts-almojadilah5-1.mp3ts-almojadilah5-3a.mp3ts-almojadilah5-3b.mp3ts-almojadilah6-1.mp3ts-almojadilah6-2.mp3ts-almojadilah6-3.mp3ts-almojadilah7-1.mp3ts-almojadilah7-2.mp3ts-almojadilah7-3.mp3ts-almojadilah7-4.mp3ts-almojadilah12-1.mp3ts-almojadilah22-2.mp3ts-almojadilah42-3.mp3test3.txttest14.txttest22.txt
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now