Sign in to follow this  
Followers 0
Alexxander

_FileListToArray sorting ?

21 posts in this topic

Hi 

I'am trying to list files from folder sorted by name (same as the picture)

Untitled.png

i tried this code

#include <File.au3>

 $arr = _FileListToArray("D:\2")
 _ArrayDisplay($arr)

i am getting this result

 

Untitled.png

Any one could explain why it is putting 10-1 before 8-1 ?

how can i make Autoit view file same as windows explorer ?


Share this post


Link to post
Share on other sites



#4 ·  Posted (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 by Jfish
1 person likes this

Build your own poker game with AutoIt: pokerlogic.au3 | Learn To Program Using FREE Tools with AutoIt

Share this post


Link to post
Share on other sites

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

1 person likes this

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______My UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Share this post


Link to post
Share on other sites

#6 ·  Posted (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 by Alexxander

Share this post


Link to post
Share on other sites

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._______My UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Share this post


Link to post
Share on other sites

#8 ·  Posted (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 by jguinch
1 person likes this

Share this post


Link to post
Share on other sites

#9 ·  Posted (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

Untitled.png

Im confused about this this thing may  some explain what is happening please ?

Edited by Alexxander

Share this post


Link to post
Share on other sites

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
1 person likes this

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______My UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Share this post


Link to post
Share on other sites

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

Untitled.png

 

this is my last request please help me bro ...


Share this post


Link to post
Share on other sites

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)
1 person likes this

Share this post


Link to post
Share on other sites

#13 ·  Posted (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 

Untitled.png

 

i dont understand why autoit dont just order files like windows or view same in the order that windows is showing them currently !!

Edited by Alexxander

Share this post


Link to post
Share on other sites

#14 ·  Posted (edited)

This topic is a long run  :D

#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 by mikell
2 people like this

Share this post


Link to post
Share on other sites

#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)

1 person likes this

Share this post


Link to post
Share on other sites

#16 ·  Posted (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

Untitled.png

 

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

Untitled.png

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 :D

Edited by Alexxander

Share this post


Link to post
Share on other sites

:)

#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)

Share this post


Link to post
Share on other sites

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 


Share this post


Link to post
Share on other sites

#19 ·  Posted (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 by czardas

Share this post


Link to post
Share on other sites

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.

#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   ;==>__TestExp

Click Show button to see results.

Unsorted Data:-

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

Sorted when $fDeciminalSort = 0 (like two separate numbers):-

1-1.mp3

1-2.mp3

2-1.mp3

2-2.mp3

10-1.mp3

10-3.mp3

15.mp3

20-1.mp3

282-01.mp3

282-1.mp3

282-2.mp3

282-3.mp3

282-4.mp3

282-5.mp3

282-5.mp3

282-6.mp3

282-7.mp3

282-8.mp3

282-9.mp3

282-10.mp3

282-11.mp3

282-12.mp3

282-13.mp3

282-14.mp3

282-15.mp3

283.mp3

283-1.mp3

283-2.mp3

283-3.mp3

283-4.mp3

283-5.mp3

ts-almojadilah1-1.mp3

ts-almojadilah1-2.mp3

ts-almojadilah2-4.mp3

ts-almojadilah3-1.mp3

ts-almojadilah3-2.mp3

ts-almojadilah3-3.mp3

ts-almojadilah4-1.mp3

ts-almojadilah4-2.mp3

ts-almojadilah4-3.mp3

ts-almojadilah4-4.mp3

ts-almojadilah4-5.mp3

ts-almojadilah5.mp3

ts-almojadilah5-1.mp3

ts-almojadilah5-3a.mp3

ts-almojadilah5-3b.mp3

ts-almojadilah6-1.mp3

ts-almojadilah6-2.mp3

ts-almojadilah6-3.mp3

ts-almojadilah7-1.mp3

ts-almojadilah7-2.mp3

ts-almojadilah7-3.mp3

ts-almojadilah7-4.mp3

ts-almojadilah12-1.mp3

ts-almojadilah22-2.mp3

ts-almojadilah42-3.mp3

test3.txt

test14.txt

test22.txt

Sorted when $fDeciminalSort = 1 (like a decimal) :-

1-1.mp3

1-2.mp3

2-1.mp3

2-2.mp3

10-1.mp3

10-3.mp3

15.mp3

20-1.mp3

282-01.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-5.mp3

282-6.mp3

282-7.mp3

282-8.mp3

282-9.mp3

283.mp3

283-1.mp3

283-2.mp3

283-3.mp3

283-4.mp3

283-5.mp3

ts-almojadilah1-1.mp3

ts-almojadilah1-2.mp3

ts-almojadilah2-4.mp3

ts-almojadilah3-1.mp3

ts-almojadilah3-2.mp3

ts-almojadilah3-3.mp3

ts-almojadilah4-1.mp3

ts-almojadilah4-2.mp3

ts-almojadilah4-3.mp3

ts-almojadilah4-4.mp3

ts-almojadilah4-5.mp3

ts-almojadilah5.mp3

ts-almojadilah5-1.mp3

ts-almojadilah5-3a.mp3

ts-almojadilah5-3b.mp3

ts-almojadilah6-1.mp3

ts-almojadilah6-2.mp3

ts-almojadilah6-3.mp3

ts-almojadilah7-1.mp3

ts-almojadilah7-2.mp3

ts-almojadilah7-3.mp3

ts-almojadilah7-4.mp3

ts-almojadilah12-1.mp3

ts-almojadilah22-2.mp3

ts-almojadilah42-3.mp3

test3.txt

test14.txt

test22.txt

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Similar Content

    • Dimmae
      By Dimmae
      Hello,
      at first: i'm new here, so please forgive me my mistakes, and show them to me, just that i can learn to do better in the future.
      Now to my Problem: i have an excel sheet, where i just need some columns for further actions, but i have no idea how to add single columns to a new array.
      I found the following code(the one i just added as a file) from 'water' in this forum, but i wont get how i could add multiple columns into a new array.
      The biggest problem in my situation is that i dont know the count of the rows i need for the array, i just got a fix number of rows, which is 4.
       
      Hope you can help me, and sry again for this 'unlucky illustration'.
       
      btw: how can i add code shown as code here, instead of posting it as a attached file?.
       
       
       
      autoit-select-column.au3
      defects.xlsx
    • czardas
      By czardas
      Haven't had much time to code recently. However the following thread inspired me.
      The debate about linear, parallel and binary search methods was rather interesting and, in an attempt to be diplomatic, I decided to combine @jchd's suggestion with @LarsJ's binary search example. I decided that the binary search algorithm required modification to make it more linear. As usual, 'if you invent something, it probably already exists and if it already exists, it exists for a reason'. My first attempt was not all that good. The code worked but was really a mess. I blame peer pressure (to post an example of a parallel search method).  I will delete that old code in due course.
      With a little memory jogging and a glance at the help file, the solution turned out to be quite easy: I just needed a better understanding of Euler. Further modification will be needed to work with more complicated unicode strings. The output could be returned as an array or a delimitered string. I'm not so interested in those details. I'm just going to post the algorithm for now and anyone, who wants to, can modify it to suit their needs. Both arrays must contain at least 1 element.
      Local $aFoo = [0,1,2,3,4,5,6,7,9,10,11,12,13,14,15,16,19,20,23,24,26,30,35,39,40,41] Local $aBar = [0,1,5,6,7,8,9,10,11,12,13,14,17,18,19,21,24,25,26,27,34,35,38,40] ParallelExponetialSearch($aFoo, $aBar) ; Compares two lists - returning positive matches. Each input array must be unique (individually) and in alphabetical order. Func ParallelExponetialSearch($aFoo, $aBar) Local $sFind, _ $iMin_F = -1, $iMax_F = UBound($aFoo) -1, $Lo_F = $iMin_F, $Hi_F, _ $iMin_B = -1, $iMax_B = UBound($aBar) -1, $Lo_B = $iMin_B, $Hi_B While $iMin_F < $iMax_F And $iMin_B < $iMax_B ; Toggle Arrays - Which array has most untested elements? This is the one we want to search next, ; so we can bypass more comparisons because (in theory) mismatches have a greater chance of being skipped. If $iMax_F - $iMin_F >= $iMax_B - $iMin_B Then ; $aFoo has more (or an equal number of) untested elements $Hi_F = $iMax_F $iMin_B += 1 $sFind = $aBar[$iMin_B] While $Lo_F < $Hi_F ; search $aFoo For $i = 0 To Floor(Log($Hi_F - $Lo_F) / Log(2)) $Lo_F = $iMin_F + 2^$i If $aFoo[$Lo_F] = $sFind Then $iMin_F = $Lo_F ; each match should be added to the output [perhaps an array] ConsoleWrite($sFind & " found at $aFoo[" & $Lo_F & "] = $aBar[" & $iMin_B & "]" & @LF) ExitLoop 2 ElseIf $aFoo[$Lo_F] > $sFind Then $Hi_F = $Lo_F -1 $iMin_F += Floor(2^($i -1)) $Lo_F = $iMin_F ContinueLoop 2 EndIf Next $iMin_F = $Lo_F ; minimum increment is one WEnd Else ; $aBar has more untested elements $Hi_B = $iMax_B $iMin_F += 1 $sFind = $aFoo[$iMin_F] While $Lo_B < $Hi_B ; search $aBar For $i = 0 To Floor(Log($Hi_B - $Lo_B) / Log(2)) $Lo_B = $iMin_B + 2^$i If $aBar[$Lo_B] = $sFind Then $iMin_B = $Lo_B ; each match should be added to the output [perhaps an array] ConsoleWrite($sFind & " found at $aFoo[" & $iMin_F & "] = $aBar[" & $Lo_B & "]" & @LF) ExitLoop 2 ElseIf $aBar[$Lo_B] > $sFind Then $Hi_B = $Lo_B -1 $iMin_B += Floor(2^($i -1)) $Lo_B = $iMin_B ContinueLoop 2 EndIf Next $iMin_B = $Lo_B ; minimum increment is one WEnd EndIf WEnd EndFunc ;==> ParallelExponetialSearch I hope this will be useful to someone. I believe it deserved a thread of its own!
    • RC86
      By RC86
      Afternoon!
      I have a requirement to return both a string and an array from a function so as a result I put them both into an array and returned that.  I can access them in their entirety after returning them but then I can't seem to access the array elements after this.  Should I be able to or is there a prettier way?
      #include <Array.au3> ;Memory info returned as a string and an array $memoryInfo = _getMemoryInfo() msgbox(0,"Memory Info",$memoryInfo[0]) _ArrayDisplay($memoryInfo[1],"Memory as an Array") Local $newArray[7] $memoryInfo[1] = $newArray msgbox(0,"Test element",$newArray[0]) _ArrayDisplay($newArray) Func _getMemoryInfo() Local $newArray[7] Local $array = MemGetStats() $newArray[0] = $array[0] ;% of memory in use $newArray[1] = Round($array[1]/1024 * 0.001,2) ;Total physical RAM $newArray[2] = Round($array[2]/1024 * 0.001,2) ;Availaible physical RAM $newArray[3] = Round($array[3]/1024 * 0.001,2) ;Total pagefile $newArray[4] = Round($array[4]/1024 * 0.001,2) ;Available pagefile $newArray[5] = Round($array[5]/1024 * 0.001,2) ;Total virtual $newArray[6] = Round($array[6]/1024 * 0.001,2) ;Available virtual $memoryUsage = $newArray[1] - $newarray[2] $pagefileUsage = $newArray[3] - $newarray[4] ;Output/Return Local $returnArray[2] $returnArray[0] = "Memory: " & $memoryUsage & " GB/" & $newArray[1] & " GB " & @CRLF & "Pagefile: " & $pagefileUsage & " GB/" & $newArray[3] & " GB " $returnArray[1] = $newArray return $returnArray EndFunc A bit messy but hopefully it's understandable what I'm trying to achieve.
      Thanks!
    • Jibberish
      By Jibberish
      I am having difficulties getting updated results from GUICtrlCreateInput. I wrote a small script to demonstrate what I am trying to do.
      This script reads a text file into an array and displays the Name and Number from the text file.
      The user can check a name and change the number, and the results are displayed in _ArrayDisplay.
      Only the Checked names are displayed in their original position. This is necessary for future
      plumbing.
      The problem with this script is the original number is returned, not the changed number. I cannot
      figure out how to get the updated number to be displayed.
      ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; ; This script reads a text file into an array and displays the Name and Number from the text file. ; The user can check a name and change the number, and the results are displayed in _ArrayDisplay. ; Only the Checked names are displayed in their original position. This is necessary for future ; plumbing. ; ; The problem with this script is the original number is returned, not the changed number. I cannot ; figure out how to get the updated number to be displayed. ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include-once #include <MsgBoxConstants.au3> #include <array.au3> #include <Date.au3> #include <WinAPIFiles.au3> #include <AutoItConstants.au3> #include <Misc.au3> #include <File.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> Local $iMax = 6 ;Default number of Videos - 1 for the array counter Dim $aTextFile[$iMax][2] ; [start with 5 entries][Name, Number] Don't get confused! [Row][Column] Local $i = 0 Local $iLeft = 30 Local $iTop = 30 Local $sName Local $sNumber Local $aArray Local $iMaxCol = 5 Local $iRow = 0 Local $iCol = 0 Local $aNumberCount[$iMaxCol][2] $aArray1 = ReadFile() $aNamesNumbers = DisplayNames($aArray1) _ArrayDisplay($aNamesNumbers) ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; ; ReadFile() places the contents of the NameNumber.txt file in an array ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Func ReadFile() Local $sFileData = @ScriptDir & "\NameNumber.txt" Local $iStrReturn = 0 Local $aArrayFile Local $aTextFile[$iMaxCol][2] Local $aName Local $sCheckBox1 Const $iL = 10 ; Count from Left for GUI so all buttons line up Local $sFill Local $iA = 0, $iN = 0 ; Put the Names into an Array _FileReadToArray($sFileData, $aArrayFile) For $iA = 0 To $aArrayFile[0] ; Step through the array looking for Names If StringInStr($aArrayFile[$iA], "Name:") Then $aName = StringSplit($aArrayFile[$iA],":") $sFill = $aName[2] If UBound($aTextFile) <= $iRow Then ; Resize the array when $iRow is equal to the element count in the array to prevent subscript error ReDim $aTextFile[UBound($aTextFile) + 1][$iMaxCol] EndIf $aTextFile[$iRow][$iCol] = $sFill $iRow += 1 EndIf Next $iCol = 1 $iRow = 0 $sFill = "" For $iA = 1 To $aArrayFile[0] ; Step through the array looking for Numbers If StringInStr($aArrayFile[$iA], "Number:") Then $aName = StringSplit($aArrayFile[$iA],":") $sFill = $aName[2] If UBound($aTextFile) <= $iRow Then ; Resize the array when $iRow is equal to the element count in the array to prevent subscript error ReDim $aTextFile[UBound($aTextFile) + 1][$iMaxCol] EndIf $aTextFile[$iRow][$iCol] = $sFill $iRow += 1 EndIf Next Return $aTextFile EndFunc ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; ; Display the Name and Number ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Func DisplayNames($aArray1) Local $aName[$iMax] Local $aNumbers[$iMax] $iMMCount = UBound($aArray1) $iMMCount -=1 Local $iWidth = 300 Local $iLength = 300;$iMMCount * 30 GUISetFont(12) $hGUI = GUICreate("Edit / Update Number Test", $iWidth, $iLength, -1, -1) GUICtrlCreateLabel(" Name Number",1,5) ;$iTop += 30 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; ; Display Name with a Checkbox. Only Checked Names should be saved. ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For $i = 0 to $iMMCount Step 1 $sNameText = $aArray1[$i][0] $iNameLength = StringLen($sNameText) $aName[$i] = GUICtrlCreateCheckbox($sNameText,$iLeft, $iTop) $iTop += 30 Next ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; ; Display the number from the text file below each name. Allow the user to change the number and display the ; new number. ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $iLeft = 60 GUIStartGroup() $iTop = 28 For $i = 0 to $iMMCount Step 1 $sNumberText = $aArray1[$i][1] $aNumberCount[$i][1] = $sNumberText $aNumberCount[$i][0] = GUICtrlCreateInput($sNumberText,$iLeft, $iTop, 50,18, $GUI_DOCKAUTO) GUICtrlSetPos($aNumberCount[$i][0],200) $iTop += 30 Next ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; ; Read the checked names and (possibly updated) number ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $iMMCount = UBound($aNumberCount) $iMMNewCount = $iMMCount - 1 Local $aGUICheckbox[$iMMCount] Local $aCheckedNameNumber[$iMMCount][2] $iLeft = 30 Local $idCloseGUI = GUICtrlCreateButton("Close",$iLeft, $iTop) GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $idCloseGUI For $i = 0 To $iMMNewCount Step 1 Switch GUICtrlRead($aName[$i]) Case $GUI_CHECKED $aCheckedNameNumber[$i][0] = $aArray1[$i][0] Case $GUI_UNCHECKED EndSwitch Switch GUICtrlRead($aNumberCount[$i][0]) Case $aCheckedNameNumber[$i][1] = GUICtrlRead($aNumberCount[$i][1]) EndSwitch Next ExitLoop EndSwitch WEnd For $i = 0 to $iMMNewCount step 1 GUICtrlRead($aNumberCount[$i][0]) If $aCheckedNameNumber[$i][0] <> "" Then $aCheckedNameNumber[$i][1] = $aNumberCount[$i][1] EndIf Next GUIDelete($hGUI) Return $aCheckedNameNumber EndFunc This is the text file I am reading. If you want to try this out put the NameNumber.txt file in your script directory. It's attached to the post.
      * This is a dummy file with a Name and Number * The only purpose of this file is to read the updated Number. Name:Taggart Number:916 Name:Mongo Number:90 Name:Hedley Lamarr Number:22 Name:Bart Number:9999 Name:The Waco Kid Number:2244 If I change the number, the original number is displayed at the end, not the updated/modified number. I need the modified number to be displayed.
      Thanks in advance for any assistance!
      Jibberish
      NameNumber.txt
    • Jibberish
      By Jibberish
      I am working on a Video Player Test Script. I am reading a text file into a 3d array to be displayed in a GUI.
      Array Content:
      [x][0]FileName.mp4
      [x][1]UsageCount -> Up to a 4 digit number
      [x][2]EnableUsageCount (True/False)
      In the GUI the user can check the filename box, edit the number of usages and check EnableUsageCount to turn on the UsageCount control using the UsageCount number for the maximum number of plays.
      To make this easier to deal with I have removed the EnableUsageCount section, and am just concentrating on getting a method to put the edited (or unchanged) UsageCount in the array. Currently nothing is read into the array, due to my using the wrong method in the Case statement.
      Here are code snippets of what I am trying to do:
      ; Snippets from script ; I read the text file at the bottom and put the .mp4 filenames in $aManifest[x][0] and UsageCount in $aManifest[x][1] ; Then I create a GUI to display the .mp4 filenames with checkboxes and the UsageCount to the right. UsageCount is editable by the user. ; If the filename is checked, I want to read the filename into $aCheckedVideos[x][0] and the updated UsageCount in $aCheckedVideos[x][1] ; The GUICtrlRead($aVideoName[$i]) with Case $GUI_CHECKED & UNCHECKED works for the checkboxes ; This section puts the filenames in the GUI with a checkbox For $i = 0 to $iMMCount Step 1 $sMP4Text = $aManifest[$i][0] $iMP4Length = StringLen($sMP4Text) $aVideoName[$i] = GUICtrlCreateCheckbox($sMP4Text,$iLeft, $iTop) $iTop += 30 Next ; This section reads numbers from the Manifest array, and I want to be able to change the number and have them saved. ; So the Case $GUI_CHECKED & UNCHECKED won't work here, and I can't figure out what I should be doing here. For $i = 0 to $iMMCount Step 1 $sUsageText = $aManifest[$i][1] $aUsageCount[$i] = GUICtrlCreateInput($sUsageText,$iLeft, $iTop, 50,18, $GUI_DOCKAUTO) GUICtrlSetPos($aUsageCount[$i],200) $iTop += 30 Next While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $idCloseGUI For $i = 0 To $iMMNewCount Step 1 Switch GUICtrlRead($aVideoName[$i]) Case $GUI_CHECKED $aCheckedVideos[$i][0] = $aManifest[$i][0] ; If checked, I put the results into a two D array Case $GUI_UNCHECKED ; where Video Name is $aCheckedVideos[x][0] EndSwitch Switch GUICtrlRead($aUsageCounter[$i]) Case $GUI_CHECKED $aCheckedVideos[$i][1] = $aUsageCount[$i] ;I want to put the text (numbers) in $aCheckedVideos[x][1] Case $GUI_UNCHECKED ;but what is returned is blank, probably due to EndSwitch ; $GUI_CHECKED being the wrong thing. Next ExitLoop EndSwitch WEnd ;The txt file I'm reading has the following: ;~ /** Title #1: Big Buck Bunny 1080p **/ ;~ "Name": "Big Buck Bunny", ;~ "URI": "..\\MediaFiles\\bbb_1080_60s.mp4", ;~ "UsageCount": 9999, ;~ "URI": "..\\MediaFiles\\bbb_1080_60s_enc1.mp4", ;~ "UsageCount": 45, ;~ "URI": "..\\MediaFiles\\bbb_1080_60s_enc1.mp4", ;~ "UsageCount": 2, ;~ /** Title #2: Tears of Steel 4K **/ ;~ "Name": "Tears of Steel 4K", ;~ "URI": "..\\MediaFiles\\tos_4K_60s_HEVC.mp4", ;~ "UsageCount": 9876, ;~ "URI": "..\\MediaFiles\\tos_4K_60s_HEVC_enc2.mp4", ;~ "UsageCount": 0, ;~ "URI": "..\\MediaFiles\\tos_4K_60s_HEVC_enc2.mp4", ;~ "UsageCount": 5, I am certain that the section
                          Switch GUICtrlRead($aUsageCounter[$i])
                              Case $GUI_CHECKED
                                  $aCheckedVideos[$i][1] = $aUsageCount[$i]    ;I want to put the text (numbers) in $aCheckedVideos[x][1]
                              Case $GUI_UNCHECKED                                ;but what is returned is blank, probably due to
                          EndSwitch                                            ; $GUI_CHECKED being the wrong thing.

      is wrong, and this is what I am looking for help with. Instead of $GUI_CHECKED what should I be looking for?
      The worst part of this is I had this working late last night, and then lost my changes and cannot for the life of me remember how I had this working.
      Help is truly appreciated!
      Jibberish