JohnOne Posted November 3, 2009 Posted November 3, 2009 My limited brains are exhausted trying to figure out how to populate an array from an ini file My ini looks like this [Daily} 1-1.99=Wed 1.1-2.02=Thu 1.7-2.77=Fri 2.77-2=Sat What my aim is, is to get the string before "-" into one dimension of an array, the string after "-" and before "=" into the second dimension of the array and the string after "=" (or the key value) into the third dimension of the array At the moment I'm getting the 2 dimensional array (key and value)using IniReadSection() Then looking at it I forsee a massive if, or, and, else etc... loop ahead of me, with stringsplits and array creating, copying, and re creating, with a logic I cant seem to figure out. My question is, If a StringRegExp pattern of some kind could acheive what I'm after ? I realize I may be asking a lot, and full expect to be blown out, but I cant even begin to comrehend these patterns, and would like to avoid it for now, if I am heading down the wrong path, and It cannot be done. Appreciate any replies, and any level of help. AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans.
Moderators Melba23 Posted November 3, 2009 Moderators Posted November 3, 2009 (edited) JohnOne, Is this is what you want: #include <Array.au3> $aIniArray = IniReadSection("test.ini", "Daily") _ArrayDisplay($aIniArray) Global $aFinalArray[UBound($aIniArray) - 1][3] For $i = 1 To $aIniArray[0][0] $aTemp = StringSplit($aIniArray[$i][0], "-", 2) _ArrayDisplay($aTemp) $aFinalArray[$i - 1][0] = $aTemp[0] $aFinalArray[$i - 1][1] = $aTemp[1] $aFinalArray[$i - 1][2] = $aIniArray[$i][1] Next _ArrayDisplay($aFinalArray) Not too complicated, was it? M23 Sorry - Pressed the wrong button too soon! Edited November 3, 2009 by Melba23 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
Nutster Posted November 3, 2009 Posted November 3, 2009 (edited) Try using capturing groups. Local $aDaily = IniReadSection("MyData.ini", "Daily") Local $aExpanded[UBound($aDaily,1)][3] Local $sPattern = "^([^-]*)-(.*)$" Local $I For $I = 0 To UBound($aDaily, 1) $aNums = StringRepExp($sPattern, $aDaily[$I][0], 1) $aExpanded[$I][0] = $aNums[0] $aExpanded[$I][1] = $aNums[1] $aExpanded[$I][2] = $aDaily[$I][1] Next $I ; Now $aExpanded has the layout you requested. This is not tested, so there might be bugs in it, but it should at least give you a starting point.. Edited November 3, 2009 by Nutster David NuttallNuttall Computer Consulting An Aquarius born during the Age of Aquarius AutoIt allows me to re-invent the wheel so much faster. I'm off to write a wizard, a wonderful wizard of odd...
JohnOne Posted November 3, 2009 Author Posted November 3, 2009 (edited) JohnOne, Is this is what you want: #include <Array.au3> $aIniArray = IniReadSection("test.ini", "Daily") _ArrayDisplay($aIniArray) Global $aFinalArray[UBound($aIniArray) - 1][3] For $i = 1 To $aIniArray[0][0] $aTemp = StringSplit($aIniArray[$i][0], "-", 2) _ArrayDisplay($aTemp) $aFinalArray[$i - 1][0] = $aTemp[0] $aFinalArray[$i - 1][1] = $aTemp[1] $aFinalArray[$i - 1][2] = $aIniArray[$i][1] Next _ArrayDisplay($aFinalArray) Not too complicated, was it? M23 Sorry - Pressed the wrong button too soon! Holy squirrels in santas socks That does exactly what I was after I seriously could not see shorter than a 90 something line web of a mess figuring that out, I projected about 1/2 weeks of brain hurt, along with fourty trays of cheap beer. I greatly appreciate that matey, once again you helped me immensely. Much Obliged Edited November 3, 2009 by JohnOne AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans.
JohnOne Posted November 3, 2009 Author Posted November 3, 2009 Try using capturing groups. Local $aDaily = IniReadSection("MyData.ini", "Daily") Local $aExpanded[UBound($aDaily,1)][3] Local $sPattern = "^([^-]*)-(.*)$" Local $I For $I = 0 To UBound($aDaily, 1) $aNums = StringRepExp($sPattern, $aDaily[$I][0], 1) $aExpanded[$I][0] = $aNums[0] $aExpanded[$I][1] = $aNums[1] $aExpanded[$I][2] = $aDaily[$I][1] Next $I ; Now $aExpanded has the layout you requested. This is not tested, so there might be bugs in it. Thank you Very Kindly sir I will test that also The pattern looks nowhere as complicated as I'd envisioned it, but then again, I imaging the difficult part is dreaming the pattern up. Thanks again AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans.
Nutster Posted November 3, 2009 Posted November 3, 2009 Oops, made a mistake. I put the pattern first. The string to test comes first. So it should be. Also, row 0 of IniReadSection contains state information, not real data, so skip it. Local $aDaily = IniReadSection("MyData.ini", "Daily") Local $aExpanded[UBound($aDaily,1)-1][3] Local $sPattern = "^([^-]*)-(.*)$" Local $I For $I = 1 To UBound($aDaily, 1) $aNums = StringRepExp($aDaily[$I][0], $sPattern, 1) $aExpanded[$I][0] = $aNums[0] $aExpanded[$I][1] = $aNums[1] $aExpanded[$I][2] = $aDaily[$I][1] Next $I ; Now $aExpanded has the layout you requested. This is not tested, so there might be bugs in it, but it should at least give you a starting point. David NuttallNuttall Computer Consulting An Aquarius born during the Age of Aquarius AutoIt allows me to re-invent the wheel so much faster. I'm off to write a wizard, a wonderful wizard of odd...
JohnOne Posted November 3, 2009 Author Posted November 3, 2009 Try using capturing groups. Local $aDaily = IniReadSection("MyData.ini", "Daily") Local $aExpanded[UBound($aDaily,1)][3] Local $sPattern = "^([^-]*)-(.*)$" Local $I For $I = 0 To UBound($aDaily, 1) $aNums = StringRepExp($sPattern, $aDaily[$I][0], 1) $aExpanded[$I][0] = $aNums[0] $aExpanded[$I][0] = $aNums^ ERROR ==> Subscript used with non-Array variable.: $aExpanded[$I][1] = $aNums[1] $aExpanded[$I][2] = $aDaily[$I][1] Next $I ; Now $aExpanded has the layout you requested. This is not tested, so there might be bugs in it, but it should at least give you a starting point.. Just for reference, it did spit out an error. I hope you dont mind me keeping this for learning purposes, on capturing groups. Thanks AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans.
JohnOne Posted November 4, 2009 Author Posted November 4, 2009 Been testing with the code Melba23 so kindly offered, But cannot see what I am doing wrong here. My msgbox at the end displays "0", when my expectations were for it to display "Fri" #include <Array.au3> $aIniArray = IniReadSection("test.ini", "Daily") _ArrayDisplay($aIniArray) ;<===== This Array displays fine Global $aFinalArray[UBound($aIniArray) - 1][3] For $i = 1 To $aIniArray[0][0] $aTemp = StringSplit($aIniArray[$i][0], "-", 2) _ArrayDisplay($aTemp) ;<===== This Array displays fine $aFinalArray[$i - 1][0] = $aTemp[0] $aFinalArray[$i - 1][1] = $aTemp[1] $aFinalArray[$i - 1][2] = $aIniArray[$i][1] Next _ArrayDisplay($aFinalArray) ;<===== This final Array displays fine ;What I have tried to do Local $vResult = 0 Local $ivar = 0.66 For $i = 0 to UBound($aFinalArray[0][0]) -1 If $ivar > $aFinalArray[$i][0] And $ivar <= $aFinalArray[$i][1] Then $vResult = $aFinalArray[$i][2] EndIf Next MsgBox(0,"",$vResult) Ini file [Daily} 0-0.29=Wed 0.3-0.49=Thu 0.5-0.69=Fri 0.7-0.89=Sat Can anyone give me a hint as to where I am going wrong ? AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans.
Moderators Melba23 Posted November 4, 2009 Moderators Posted November 4, 2009 JohnOne,As requested - a hint:Look at the upper bound of your For...Next loop. But if you need more:UBound takes just the array name, not the [0][0] element.For $i = 0 to UBound($aFinalArray) - 1Of interest, this will give you the count in the [0][0] element of $aFinalArray - but then you do not need to use UBound:#include <Array.au3> $aIniArray = IniReadSection("test.ini", "Daily") _ArrayDisplay($aIniArray) Global $aFinalArray[UBound($aIniArray)][3] = [[UBound($aIniArray) - 1]] _ArrayDisplay($aFinalArray) For $i = 1 To $aIniArray[0][0] $aTemp = StringSplit($aIniArray[$i][0], "-", 2) _ArrayDisplay($aTemp) $aFinalArray[$i][0] = $aTemp[0] $aFinalArray[$i][1] = $aTemp[1] $aFinalArray[$i][2] = $aIniArray[$i][1] Next _ArrayDisplay($aFinalArray) Local $vResult = 0 Local $ivar = 0.66 For $i = 1 to $aFinalArray[0][0] If $ivar > $aFinalArray[$i][0] And $ivar <= $aFinalArray[$i][1] Then $vResult = $aFinalArray[$i][2] EndIf Next MsgBox(0,"",$vResult)Do not despair - getting array bounds correct is at times difficult. I always have to think carefully and it often takes more than a few practice runs to get it right. 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
Nutster Posted November 4, 2009 Posted November 4, 2009 Just for reference, it did spit out an error.I hope you dont mind me keeping this for learning purposes, on capturing groups.ThanksPlease note that I found and fixed an error already. Also, when you report an error, it is best to report the text of the error message and the circumstances it happens under, so that others can get an idea about what your problem really is. David NuttallNuttall Computer Consulting An Aquarius born during the Age of Aquarius AutoIt allows me to re-invent the wheel so much faster. I'm off to write a wizard, a wonderful wizard of odd...
JohnOne Posted November 4, 2009 Author Posted November 4, 2009 JohnOne, As requested - a hint: Look at the upper bound of your For...Next loop. But if you need more: UBound takes just the array name, not the [0][0] element. For $i = 0 to UBound($aFinalArray) - 1 Of interest, this will give you the count in the [0][0] element of $aFinalArray - but then you do not need to use UBound: #include <Array.au3> $aIniArray = IniReadSection("test.ini", "Daily") _ArrayDisplay($aIniArray) Global $aFinalArray[UBound($aIniArray)][3] = [[UBound($aIniArray) - 1]] _ArrayDisplay($aFinalArray) For $i = 1 To $aIniArray[0][0] $aTemp = StringSplit($aIniArray[$i][0], "-", 2) _ArrayDisplay($aTemp) $aFinalArray[$i][0] = $aTemp[0] $aFinalArray[$i][1] = $aTemp[1] $aFinalArray[$i][2] = $aIniArray[$i][1] Next _ArrayDisplay($aFinalArray) Local $vResult = 0 Local $ivar = 0.66 For $i = 1 to $aFinalArray[0][0] If $ivar > $aFinalArray[$i][0] And $ivar <= $aFinalArray[$i][1] Then $vResult = $aFinalArray[$i][2] EndIf Next MsgBox(0,"",$vResult) Do not despair - getting array bounds correct is at times difficult. I always have to think carefully and it often takes more than a few practice runs to get it right. M23 Cheers M23, I couldnt see the forest for the trees. I tried all sorts before looking at your spoiler I thought the format with [][] made arrays different, not realizing that all dimensions have to be the same size. Thanks AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans.
JohnOne Posted November 4, 2009 Author Posted November 4, 2009 Please note that I found and fixed an error already. Also, when you report an error, it is best to report the text of the error message and the circumstances it happens under, so that others can get an idea about what your problem really is.Thank youI did reference the error, although I may not have done it correctlyI will try to realize the forum protocol in future, the best I canCheers AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans.
Moderators Melba23 Posted November 4, 2009 Moderators Posted November 4, 2009 JohnOne,I thought the format with [][] made arrays different, not realizing that all dimensions have to be the same size. I am somewhat confused by your remark. The [][] format (as you call it) determines the number of dimensions in the array (you can have up to 64!) - and nothing says they have to be the same size. Your problem was that you were passing an element of an array to UBound, rather than the array name. The example I gave you showed how you could use an element as a counter - assuming you had set it, of course. If you Google "AutoIt wiki array" you will find a good tutorial on arrays - you might find it useful. 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
JohnOne Posted November 4, 2009 Author Posted November 4, 2009 What I thought was that, all dimensions in an array had to have the same number of elements, for it to be valid (i'm sure I read that in the help files) I thought that I had to specify a particular dimension though, when defining Ubound I had it, in the beginning, in my thik skull, that a 3 dimensional array would look like this $array[][][] <noob admitting noobness smiley> AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans.
Moderators Melba23 Posted November 4, 2009 Moderators Posted November 4, 2009 JohnOne,Arrays can have any number of elements in up to 64 dimensions - although 2 is usually as much as a normal brain can cope with (although I have used 3D on a few occasions).Think of arrays like this. 1D arrays are like lists:[0] A [1] B [2] C [3] D2D arrays are like grids:[0] [1] [2] [0] A L W [1] B M X [2] C N Y [3] D O ZYou can have as many elements as you wish as long as you do not exceed the limit of 16,000,000 - I regularly use an array which has dimensions of [5967][4] (it holds mp3 names, some ID3 info and the date the track was last played). The great thing about arrays is that you can use For...Next loops to fill them and then to access the contents - very useful in many coding situations. Another advantage is that you can pass a single array as a parameter to a function which contains a huge number of variables within it - a very good tip to reduce the need for long parameter lists.Do look at the tutorial I suggested - arrays are very useful to a coder, but like so much you have to understand them to get the bes tout of them.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
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