UDF zum schreiben und lesen von Array´s in(aus) ein(em) INI-File

    • Offizieller Beitrag

    Servus.

    Da es in AutoIt keine Befehel zu speichern oder lesen von Array´s (in) aus einer Inidatei gibt hab ich kurzerhand selbst was geschrieben.

    Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include<IniArray_UDF.au3>
    Dim $aTest[6] = [5, "Eintrag1", "Eintrag2", "Eintrag3", "Eintrag4", "Eintrag5"]
    Dim $aTest2[6][2]
    $IniFile = @ScriptDir & "\Test.ini"
    For $i = 1 To 5;Erzeugen des 2D Testarrays
    $aTest2[$i][0] = $aTest[$i]
    $aTest2[$i][1] = $i
    Next

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

    _IniWriteArray($IniFile, "Test", "Eintrag1", $aTest, True)
    _IniWriteArray($IniFile, "Test", "Eintrag2", $aTest2, True)

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

    $Test1 = _IniReadArray($IniFile, "Test", "Eintrag1", True)
    _ArrayDisplay($Test1,"1D Array mit Index")
    $Test2 = _IniReadArray($IniFile, "Test", "Eintrag2", True)
    _ArrayDisplay($Test2,"2D Array mit Index")
    $Test1 = _IniReadArray($IniFile, "Test", "Eintrag1", False)
    _ArrayDisplay($Test1,"1D Array ohne Index")
    $Test2 = _IniReadArray($IniFile, "Test", "Eintrag2", False)
    _ArrayDisplay($Test2,"2D Array ohne Index")

    [/autoit]

    IniArray_UDF:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    ;#Function# ============================================================================================================================================
    ; Name............: _IniWriteArray
    ; Description.....: Schreibt ein 1D oder 2D Array in eine Inidatei
    ; Syntax..........: _IniWriteArray($sfilename, $sSection, $sKey, $aArray, $bStripIdx = False)
    ; Parameters......:
    ; $sfilename - Dateiname des Inifiles
    ; $sSection - Sectionname
    ; $sKey - Keyname
    ; $aArray - Das zu speichernde Array
    ; $bStripIdx - [optional] Index entfernen. Bei True wird element 0 des Array´s ignoriert
    ; Return values .:
    ; Success - 1
    ; Failure - -1 , sets @error to:
    ; | 1 Übergebenes Array ist kein Array
    ; | 2 Array ist ein 3D Array und kann nicht verarbeitet werden
    ; | 3 Array konnte nicht in String umgewandelt werden
    ; | 4 Erzeugter String konnte nicht in die INI Datei geschrieben werden
    ;
    ; Author ........: [email='Raupi@Autoit.de'][/email]
    ; Modified.......:
    ; Remarks .......:
    ; Related .......:
    ; Link ..........;
    ; Example .......;
    ; ======================================================================================================================================================
    Func _IniWriteArray($sfilename, $sSection, $sKey, $aArray, $bStripIdx = False)
    Local $iIndex = 0, $sDimens = "1D", $sTemp, $sTemp
    If UBound($aArray, 2) <> 0 Then $sDimens = "2D"
    If Not IsArray($aArray) Then Return SetError(1, 0, -1)
    If UBound($aArray, 3) <> 0 Then Return SetError(2, 0, -1)
    If $sDimens = "1D" Then
    If $bStripIdx = True Then
    $sTemp1 = _ArrayToString($aArray, '|', 1)
    If @error Then Return SetError(3, 0, -1)
    Else
    $sTemp1 = _ArrayToString($aArray, '|')
    If @error Then Return SetError(3, 0, -1)
    EndIf
    Else
    If $bStripIdx = True Then
    $sTemp1 = _Array2D2String($aArray, 1, 0, '|', ',')
    If @error Then Return SetError(3, 0, -1)
    Else
    $sTemp1 = _Array2D2String($aArray, 0, 0, '|', ',')
    If @error Then Return SetError(3, 0, -1)
    EndIf
    EndIf
    $sTemp = $sDimens & "*" & $sTemp1
    IniWrite($sfilename, $sSection, $sKey, $sTemp)
    If @error Then Return SetError(4, 0, -1)

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

    Return 1
    EndFunc ;==>_IniWriteArray

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

    ;#Function# ============================================================================================================================================
    ; Name............: _IniReadArray
    ; Description.....: Liest ein Array aus einer INI-Datei das mittels _IniWriteArray darin gespeichert wurde
    ; Syntax..........: _IniReadArray($sfilename, $sSection, $sKey, $bCreateIdx = False)
    ; Parameters......:
    ; $sfilename - Dateiname des Inifiles
    ; $sSection - Sectionname
    ; $sKey - Keyname
    ; $aArray - Das zu speichernde Array
    ; $bCreateIdx - [optional] Bei True wird in Element 0 des Array´s die Anzahl der Einträge gespeichert
    ; Return values .:
    ; Success - Das Ausgelesene Array
    ; Failure - 0 , sets @error to:
    ; | 1 INI-Eintrag konnte nicht gelesen werden
    ; | 2 INI-Eintag wurde nicht mit _IniWriteArray in die Datei geschrieben
    ; | 3 Array konnte nicht erzeugt werden
    ;
    ; Author ........: [email='Raupi@Autoit.de'][/email]
    ; Modified.......:
    ; Remarks .......:
    ; Related .......:
    ; Link ..........;
    ; Example .......;
    ; ======================================================================================================================================================
    Func _IniReadArray($sfilename, $sSection, $sKey, $bCreateIdx = False)
    Local $sTemp, $aTemp, $aTemp1
    $sTemp = IniRead($sfilename, $sSection, $sKey, "Not Found")
    If $sTemp = "Not Found" Then Return SetError(1, 0, 0)
    $aTemp = StringSplit($sTemp, "*", 2)
    If Not IsArray($aTemp) Then SetError(2, 0, 0)
    If $aTemp[0] = "1D" Then
    If $bCreateIdx Then
    $aTemp1 = StringSplit($aTemp[1], "|", 0)
    If Not IsArray($aTemp1) Then Return SetError(3, 0, 0)
    Else
    $aTemp1 = StringSplit($aTemp[1], "|", 2)
    If Not IsArray($aTemp1) Then Return SetError(3, 0, 0)
    EndIf
    Else
    $aTemp1 = _String2Array2D($aTemp[1], '|', ',', $bCreateIdx)
    If @error Then Return SetError(3, 0, 0)
    EndIf
    Return $aTemp1
    EndFunc ;==>_IniReadArray
    ;#Function# ============================================================================================================================================
    ; Name............: _Array2D2String
    ; Description.....: Wandelt ein 2D Array in einen String um
    ; Syntax..........: _Array2D2String($Array, $iStart = 0, $iEnd = 0, $DelimRow = '|', $DelimCol = ',')
    ; Parameters......:
    ; $Array - Array das umgewandelt werden soll
    ; $iStart - [optional] Index ab welchem gestartet werden soll
    ; $iEnd - [optional] Index bis zu welchem verarbeitet werden soll
    ; $DelimRow - [optional] Seperator für Rows
    ; $DelimCol - [optional] Seperator für Colums
    ; Return values .:
    ; Success - String mit dem Inhalt des Array´s
    ; Failure - 1 Übergebenes Array ist kein Array

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

    ; Author ........: [email='BugFix@Autoit.de'][/email]
    ; Modified.......:
    ; Remarks .......:
    ; Related .......:
    ; Link ..........;
    ; Example .......;
    ; ======================================================================================================================================================
    Func _Array2D2String($Array, $iStart = 0, $iEnd = 0, $DelimRow = '|', $DelimCol = ','); Funktion zum erstellen eines Strings von einem 2D Array (c) BugFix
    If Not IsArray($Array) Then Return SetError(1, 0, 0)
    Local $sOut = ''
    If $iStart < 0 Then $iStart = 0
    If $iEnd = 0 Or $iEnd > UBound($Array) - 1 Then $iEnd = UBound($Array) - 1
    For $i = $iStart To $iEnd
    For $j = 0 To UBound($Array, 2) - 1
    $sOut &= $Array[$i][$j] & $DelimCol
    Next
    $sOut = StringTrimRight($sOut, 1) & $DelimRow
    Next
    Return StringTrimRight($sOut, 1)
    EndFunc ;==>_Array2D2String

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

    ;#Function# ============================================================================================================================================
    ; Name............: _String2Array2D
    ; Description.....: Wandel einen mit _Array2D2String konvertierten String in ein Array um.
    ; Syntax..........: _String2Array2D($string, $DelimRow = '|', $DelimCol = ',', $nIndex = False)
    ; Parameters......:
    ; $string - Umzuwandelnder String
    ; $DelimRow - [optional] Seperator für Rows
    ; $DelimCol - [optional] Seperator für Colomns
    ; $bIndex - [optional] Index mit Anzahl der enthaltenen Einträge wird erstellt. False = kein Index erstellen
    ; Return values .:
    ; Success - Array das erstellt wurde
    ; Failure - 1 Parameter $bIndex ist nicht vom Type Boolean
    ; - 2 Row Split nicht erfolgreich
    ; - 3 Column Split nicht erfolgreich
    ; Author ........: [email='BugFix@Autoit.de'][/email]
    ; Modified.......: [email='Raupi@Autoit.de'][/email]
    ; Remarks .......:
    ; Related .......:
    ; Link ..........;
    ; Example .......;
    ; ======================================================================================================================================================
    Func _String2Array2D($string, $DelimRow = '|', $DelimCol = ',', $Idx = False); Funktion von BugFix erweitert von Raupi
    If Not IsBool($Idx) Then Return SetError(1, 0, 0)
    Local $tmp = StringSplit($string, $DelimRow, 2)
    If @error Then Return SetError(2, 0, 0)
    Local $tmp1 = StringSplit($tmp[0], $DelimCol, 2)
    If @error Then Return SetError(3, 0, 0)
    Local $aOut[UBound($tmp) + $Idx][UBound($tmp1)]
    For $i = 0 To UBound($tmp) - 1
    $tmp1 = StringSplit($tmp[$i], $DelimCol, 2)
    For $j = 0 To UBound($tmp1) - 1
    $aOut[$i + $Idx][$j] = $tmp1[$j]
    Next
    Next
    If $Idx = True Then $aOut[0][0] = UBound($aOut, 1) - 1
    Return $aOut
    EndFunc ;==>_String2Array2D

    [/autoit]

    Zu beachten ist, das die Zeichen | , und * im Array nicht vorkommen dürfen, da sie zum Erzeugen des Array benutz werden. Ggf. muß die Funktion angepaßt werden.
    Ich hoffe die Funktionen kann jemand gebrauchen.

  • @Raupi

    Deinen verlinkten UDFs fehlen die Dateien (wohl durch den Serverumzug) ... magst Du die Dateien wieder an die Beiträge hängen?

    WM_Notify per Funktion UDF zum Anzeigen von Hilfetexten und einer Uhr in der Statusbar.Anzeige einer Uhr in der Menüzeile
    GIF,JPG und BMP Dateien aus Resource laden. Array aus Dll-Datei laden UDF zum schreiben und lesen von Array´s in(aus) ein(em) INI-File
    LUA Script zum erstellen eines Funktionsheaders.

    • Offizieller Beitrag

    Habe keinen Plan wo ich die ganzen UDFs rumfliegen habe. :whistling:
    Die UDF zu diesem Thread ist doch in 2. Spoiler des 1. Post. ;)

  • Hey Raupi, so was ähnliches habe ich auch schon einmal geschrieben. Zu dem * und | Zeichen:
    Damals habe ich einen von den nicht druckbaren Zeichen genommen. Es bieten sich z.B. der Group separator (GS: 0x1d) und der Unit seperator (US: 0x1f) ganz gut an. Andere Option wäre natürlich noch die Zeichen einfach mithilfe eines \ zu escapen. ^^

    • Offizieller Beitrag

    Die UDF ist über 5 Jahre alt. Heute würde ich die Seperatoren als Parameter in die Funktionen mit einbauen.
    Wer einen anderen Seperator benutzen will, kann das ja selber ändern ich benutze standardmäßig Chr(0) und Chr(2).

  • @ Make Grafik
    alter hin oder her - Deine UDF würde mich schon mal interesieren - hast Du die noch ?

    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

    • Offizieller Beitrag

    @Make-Grafik, du brauchst dich doch nicht zu entschuldigen. Du hast den Thread ja auch nicht ausgegraben ^^

  • @Peter S. Taler
    Nein, das war damals nur zwei einzelne Funktionen zum Abspeichern und lesen von 3D Arrays in eine Textdatei. Vielleicht fliegen die Funktionen irgendwo im Netz herum, hab aber ehrlich gesagt keine Lust danach zu suchen. Im Grunde hat man solche Funktionen ehh schnell mal geschrieben, sind nicht mal 5 Minuten. ^^