Jump to content

Recommended Posts

Posted (edited)

_SectionsArrays

A library for reading, writing, and managing 1D or 2D arrays,  stored in a single text file using a section-based format.
It provides functions to easily handle data, update existing sections, or add new ones.
 

; ; https://www.autoitscript.com/forum/topic/213059-_sectionsarrays/
;---------------------------------------------------------------------------------------
; Title...........: _SectionsArrays
; Description.....: A library for reading, writing, and managing 1D or 2D arrays,
;                   stored in a single text file using a section-based format.
;                   It provides functions to easily handle data, update existing sections, or add new ones.
; AutoIt Version..: 3.3.16.1   Author: ioa747  Script Version: 0.3
; Note............: Testet in Win10 22H2
;---------------------------------------------------------------------------------------
#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>

Example()

Func Example()

    Local $sArraysFilepath = @ScriptDir & "\arrays.txt"

    If Not FileExists($sArraysFilepath) Then _MakeArrays($sArraysFilepath)
    If @error Then ConsoleWrite("_MakeArrays @error=" & @error & @CRLF)

    Local $aSections = _ArraysFromFile($sArraysFilepath)
    If @error Then ConsoleWrite("_ArraysFromFile @error=" & @error & @CRLF)

    ShellExecute($sArraysFilepath)
    Sleep(500)

    _ArraysDisplay($aSections, "Array Sections")

EndFunc   ;==>Example

Func _MakeArrays($sFilePath)  ; Make examples arrays

    ; Prepare Sections array
    Local $aSections[1][2]
    $aSections[0][0] = 0

    Local $Info

    ; "Monthly zoo Report" array
    Local $Array[][] = [ _
            ["Month", "Bears", "Dolphins", "Whales"], _
            ["jan", 8, 150, 80], _
            ["feb", 54, 77, 54], _
            ["mar", 93, 32, 10], _
            ["apr", 116, 11, 76], _
            ["may", 137, 6, 93], _
            ["jun", 184, 1, 72]]
    ; Add array to Sections array
    $Info = _AddArrayToArrays($aSections, "Monthly zoo Report", $Array)
    ConsoleWrite("add $Info=" & $Info & @CRLF)

    ; "Base Items" array
    Local $aArray_Base[2][2] = [["Item 0 - 0", "Item 0 - 1"], ["Item 1 - 0", "Item 1 - 1"]]
    ; Add array to Sections array
    $Info = _AddArrayToArrays($aSections, "Base Items", $aArray_Base)
    ConsoleWrite("add $aArray_Base=" & $Info & @CRLF)

    ; "item Index" array
    Local $aIndex[10] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    ; Add array to Sections array
    $Info = _AddArrayToArrays($aSections, "item Index", $aIndex)
    ConsoleWrite("add $aIndex=" & $Info & @CRLF)

    ; "item Index2" array
    Local $aIndex2[1][10] = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
    $Info = _AddArrayToArrays($aSections, "item Index2", $aIndex2)
    ConsoleWrite("add $aIndex2=" & $Info & @CRLF)

    ; Save arrays to file
    _ArraysToFile($sFilePath, $aSections)

EndFunc   ;==>_MakeArrays


;--------------------------------------------------------------------------------------------------------------------------------
; Help functions (A library for reading, writing, and managing 1D or 2D arrays, stored in a single text file using a section-based format.)
;--------------------------------------------------------------------------------------------------------------------------------
Func _ArraysDisplay(ByRef $aItems, $sTitle = "")    ; Creates a GUI window to display and browse the contents of multiple arrays.
    Local $hGUI = GUICreate($sTitle, 300, 200, -1, -1, $WS_OVERLAPPEDWINDOW)
    Local $idListview = GUICtrlCreateListView("Sections  | Arrays", 0, 0, 300, 200, $LVS_SINGLESEL)
    GUICtrlSetFont(-1, 10)
    _GUICtrlListView_SetExtendedListViewStyle($idListview, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
    _GUICtrlListView_SetColumnWidth($idListview, 0, 170)
    _GUICtrlListView_SetColumnWidth($idListview, 1, 120)
    GUISetState(@SW_SHOW)

    Local $aIdItems[UBound($aItems, 1)]
    If @error Then Return SetError(@error, 0, 0)
    $aIdItems[0] = $aItems[0][0]
    For $i = 1 To $aIdItems[0]
        Local $sLabel = "error"
        Local $aArray = $aItems[$i][1]
        If IsArray($aArray) Then
            Local $iDimension = UBound($aArray, $UBOUND_DIMENSIONS) ; The dimension of the array e.g. 1/2/3 dimensional.
            Local $sDim = ""
            For $d = 1 To $iDimension
                $sDim &= "[" & UBound($aArray, $d) & "]"
            Next
            $sLabel = "Array" & $sDim
        EndIf

        $aIdItems[$i] = GUICtrlCreateListViewItem($aItems[$i][0] & " | {" & $sLabel & "}", $idListview)
    Next

    Local $iMsg
    While 1
        $iMsg = GUIGetMsg()
        Switch $iMsg
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $GUI_EVENT_RESIZED
                Local $iWH = WinGetClientSize($hGUI)
                GUICtrlSetPos($idListview, 0, 0, $iWH[0], $iWH[1])
            Case $aIdItems[1] To $aIdItems[$aIdItems[0]]
                Local $id = $iMsg - $aIdItems[1] + 1
                $aArray = $aItems[$id][1]
                _ArrayDisplay($aArray, $aItems[$id][0])
        EndSwitch
    WEnd
    GUIDelete()
EndFunc   ;==>_ArraysDisplay
;--------------------------------------------------------------------------------------------------------------------------------
Func _AddArrayToArrays(ByRef $aArrays, $sName, $aNewArray)    ; Adds a new array to the main array structure, or updates an existing one.
    Local $iCurrentSections = $aArrays[0][0]

    ; Check if the section name already exists
    For $i = 1 To $iCurrentSections
        If $aArrays[$i][0] = $sName Then
            ; Section exists, update the array
            $aArrays[$i][1] = $aNewArray
            Return True
        EndIf
    Next

    ; Section does not exist, add a new one
    ReDim $aArrays[$iCurrentSections + 2][2]

    ; Add the new section name and the array
    $aArrays[$iCurrentSections + 1][0] = $sName
    $aArrays[$iCurrentSections + 1][1] = $aNewArray

    ; Update the total number of sections count
    $aArrays[0][0] = $iCurrentSections + 1

    Return True
EndFunc   ;==>_AddArrayToArrays
;--------------------------------------------------------------------------------------------------------------------------------
Func _ArraysToFile($sFilePath, $aArrays, $sDelim_Col = "|")  ; Saves a multi-array structure back to a text file.
    Local $sOutput = ""
    Local $iNumSections = $aArrays[0][0]

    ; Loop through each section
    For $i = 1 To $iNumSections
        Local $sSectionName = $aArrays[$i][0]
        Local $aCurrentArray = $aArrays[$i][1]

        ; Get the array dimension
        Local $iDimension = UBound($aCurrentArray, $UBOUND_DIMENSIONS)

        ; Append the section name with the dimension to the output string
        $sOutput &= "[" & $sSectionName & "]" & $iDimension & "D" & @CRLF

        ; Convert the array to a string
        Local $sArrayString = _ArrayToString($aCurrentArray, $sDelim_Col)

        ; Append the array string to the output, followed by a newline
        $sOutput &= $sArrayString & @CRLF & @CRLF
    Next

    Local $hFile = FileOpen($sFilePath, $FO_OVERWRITE + $FO_UTF8_NOBOM)
    If $hFile = -1 Then
        Return SetError(1, 0, False)
    EndIf

    FileWrite($hFile, $sOutput)
    FileClose($hFile)

    Return True
EndFunc   ;==>_ArraysToFile
;--------------------------------------------------------------------------------------------------------------------------------
Func _RemoveArraySection(ByRef $aArrays, $sName)   ; Removes a section and its corresponding array from the main array structure.
    Local $iCurrentSections = $aArrays[0][0]
    ; Check if the section name exists
    For $i = 1 To $iCurrentSections
        If $aArrays[$i][0] = $sName Then
            _ArrayDelete($aArrays, $i)
            $aArrays[0][0] = $iCurrentSections - 1
            ReDim $aArrays[$iCurrentSections][2]
            Return True
        EndIf
    Next
    Return False ; Section not found
EndFunc   ;==>_RemoveArraySection
;--------------------------------------------------------------------------------------------------------------------------------
Func _ArraysFromFile($sFilePath, $sDelim_Col = "|") ; Reads a text file containing multiple sections and converts them into a 2D array structure.
    Local $sFileTxt = FileRead($sFilePath)
    If @error Then Return SetError(1, 0, "")

    ; Put a @CRLF in start, and convert all @LF, @CR to @CRLF
    $sFileTxt = @CRLF & StringRegExpReplace($sFileTxt, "(\r\n|\n)", @CRLF)

    ; split String in (@CRLF & "[")
    Local $aPart = StringSplit($sFileTxt, @CRLF & "[", 1)
    If $aPart[0] < 2 Then Return SetError(2, 0, "")

    Local $aSections[$aPart[0]][2]
    $aSections[0][0] = $aPart[0] - 1

    For $i = 2 To $aPart[0]
        ; normal first line is the (name & ])
        Local $iPos = StringInStr($aPart[$i], "]", 0, -1)
        If Not $iPos > 0 Or @error Then Return SetError(3, 0, "")

        ; find the name and the Dimension
        Local $sName = StringLeft($aPart[$i], $iPos - 1)
        Local $iDimension = 0 + Number(StringMid($aPart[$i], $iPos + 1, 1))
        If Not ($iDimension = 1 Or $iDimension = 2) Then Return SetError(4, 0, "")

        ; remove leading CRLF or LF from front & back
        Local $sString = StringRegExpReplace(StringTrimLeft($aPart[$i], $iPos + 2), '(^[\r\n]+|[\r\n]+$)', '')
        Local $aArrayFromText

        ; $iDimension - 1 to $bForce2D => true
        $aArrayFromText = _ArrayFromString($sString, $sDelim_Col, Default, $iDimension - 1)

        $aSections[$i - 1][0] = $sName
        $aSections[$i - 1][1] = $aArrayFromText
    Next

    Return $aSections
EndFunc   ;==>_ArraysFromFile
;--------------------------------------------------------------------------------------------------------------------------------

 

Please, every comment is appreciated!
leave your comments and experiences here!
Thank you very much  :)

 

Edited by ioa747
Version: 0.3

I know that I know nothing

Posted (edited)
;Local $aIndex[10] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Local $aIndex[1][10] = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]

It'd be nice to do something to differentiate between 1D and 2D. Tho this is the only scene where it would not conform to recreate the original array 🤔
Thanks for sharing :)

Edit: ; split String in (@CRLF & @CRLF & "{") ; for 1D ?
; split String in (@CRLF & @CRLF & "[") ; for 2D ?, and yes I added a 2nd @CRLF ;)

Edit2: or, add what it is to it, like: [my array 1D]  or  [my array 2D]  just as an internal indicator ?

Edited by argumentum
better ?

Follow the link to my code contribution ( and other things too ).
FAQ - Please Read Before Posting.
autoit_scripter_blue_userbar.png

Posted (edited)

 

4 hours ago, argumentum said:

It'd be nice to do something to differentiate between 1D and 2D.


I took option 2  :)

[my array ]1D  or  [my array ]2D

I couldn't trick _ArrayFromString into creating a 2D array with one row and had to create a new function.  :sweating:

Thank you very much for the suggestion and the enlightenment.

update to version: 0.2

Edited by ioa747

I know that I know nothing

Posted
38 minutes ago, ioa747 said:

I couldn't trick _ArrayFromString into creating a 2D array with one row

#include <Array.au3>
_ArrayFromString ( $sArrayStr [, $sDelim_Col = "|" [, $sDelim_Row = @CRLF [, $bForce2D = False [, $iStripWS = $STR_STRIPLEADING + $STR_STRIPTRAILING]]]] )
$bForce2D [optional] default is False. True will force a 2 dimensional array even if 1 dimensional. 

If it does not work as described, let me know to fix it.

Follow the link to my code contribution ( and other things too ).
FAQ - Please Read Before Posting.
autoit_scripter_blue_userbar.png

Posted

and imagine that I tried it, and it didn't work. :blink:
But now with the certainty that you said it, and with a second glance it cleared up, and it worked :)

Thank you very much for the support.

update to version: 0.3

I know that I know nothing

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
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...