.Ini vollständig in ein Array lesen

  • In einem Tutorial von BugFix heißt es:

    Auch einige Funktionen liefern von Haus aus ein 2-D Array zurück.
    Nehmen wir als Bsp. IniReadSection("filename", "section")
    So sieht unsere INI-Datei aus:
    [sektion]
    schluesselA=1
    schluesselB=2
    schluesselC=3
    schluesselD=4
    Jetzt lesen wir die Sektion ein:
     #include
    Local $val ; Variable für Array deklarieren
    $val = IniReadSection($pathINI, "sektion") ; Sektion einlesen
    If (Not IsArray($val)) Then ; Wenn zurückgegebene Variable kein Array ist
    MsgBox(0, '', 'INI-Sektion konnte nicht gelesen werden')
    Exit
    EndIf
    _ArrayDisplay($val, 'Inhalt INI-Sektion: [sektion]') ; eingelesenes Array anzeigen
    Schauen wir uns den Inhalt des Array an:
     $val[0][0] = 4 ; Anzahl der eingelesenen Schlüssel-Wert Paare
     $val[1][0] = 'schluesselA' ; Name des Schlüssels
    $val[1][1] = 1 ; Wert des Schlüssels


    Wie bekomme ich jedoch die restlichen Sektionen in das Array?


    Inhalt der .Ini ist:

    [1]
    Nachname=Mustermann
    Vorname=Maria
    Strasse=Heidestr. 17
    Plz=10557
    Ort=Berlin
    Bearbeiter=
    Bemerkungen=
    Erledigt=
    [2]
    Nachname=Musterfrau
    Vorname=Heiner
    Strasse=Heidestr. 17
    Plz=10557
    Ort=Berlin
    Bearbeiter=
    Bemerkungen=
    Erledigt=


    Mit _Arrayadd wird der Inhalt des Arrays immer wieder überschrieben?!?! :(


    Vielen Dank BugFix für den ersten Ansatz!

  • Hallo BigldDad,

    ich würde daraus ein 2D-Array erzeugen:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Global $aDB[2][2]

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

    $sIni = @ScriptDir & "\db.ini"
    $aSections = IniReadSectionNames($sIni)

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

    For $i = 1 To $aSections[0]
    $aSection = IniReadSection($sIni, $aSections[$i])
    ;_ArrayDisplay($aSection)
    If $i = 1 Then
    ReDim $aDB[$aSections[0] + 1][$aSection[0][0] + 1] ;2DArray dimensionieren
    For $j = 1 To $aSection[0][0] ;Spaltenüberschrifeten eintragen
    $aDB[0][$j] = $aSection[$j][0]
    Next
    $aDB[0][0] = $aSections[0]& " / Sectionname" ;Anzahl der Zeilen
    EndIf
    For $j = 1 To $aSection[0][0]
    $aDB[$i][$j] = $aSection[$j][1]
    Next
    $aDB[$i][0] = $aSections[$i]
    Next

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

    _ArrayDisplay($aDB)

    [/autoit]

    und mit diesem weiterarbeiten,

    mfg autoBert

  • Hatte ich früher auch schonmal gebraucht und eine Funktion dafür geschrieben:

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION#
    ;==================================================================================================
    ; Function Name: _IniReadComplete($sPath [, $s_Delim="" ])
    ; Description: Eine Inidatei mit allen Sektionen in einem Array
    ; Parameter(s): $sPath Der Pfad zur Inidatei
    ; $s_Delim Trennzeichen zwischen Key und Value Standart = GUIDataSeparatorChar
    ; Return values .: Success - Array welches die gesamte Inidatei darstellt
    ; Failure - Returns 0 and Sets @Error:
    ; |1 - Die Inidatei konnte nicht gelesen werden
    ; Author(s): TheLuBu ([email='LuBu@veytal.com'][/email])
    ;==================================================================================================
    Func _IniReadComplete($s_Path, $s_Delim = "")
    If $s_Delim = "" Then $s_Delim = Opt("GUIDataSeparatorChar")
    Local $av_Sectionnames, $i_lastrow = 1, $as_initoread, $av_ret[1][2]
    $av_Sectionnames = IniReadSectionNames($s_Path)
    If @error Then Return SetError(1,0,0)
    ReDim $av_ret[1][$av_Sectionnames[0]]
    For $i = 1 To $av_Sectionnames[0]
    $av_ret[0][$i-1] = $av_Sectionnames[$i]&""
    $as_initoread = IniReadSection($s_Path, $av_Sectionnames[$i])
    For $k = 1 To $as_initoread[0][0]
    If $k = $i_lastrow Then
    $i_lastrow = $k + 1
    ReDim $av_ret[$i_lastrow][$av_Sectionnames[0]]
    EndIf
    $av_ret[$k][$i-1] = $as_initoread[$k][0] & $s_Delim & $as_initoread[$k][1]
    Next
    Next
    Return $av_ret
    EndFunc

    [/autoit]
  • Hallo,

    beide Antworten waren super hilfreich. Danke dafür. Leider ergibt sich daraus ein neues Problem.
    Ich wollte mit Hilfe einer GUI die Werte zu einem Datensatz suchen, bearbeiten und wieder zurückschreiben, sowie ganze Datensätze ergänzen. Eventuell auch die gesamte .Ini Datei zurück schreiben.
    Bin ich hier auf einem totalen Holzweg . Geht sowas auch einfacher? Z.B. mit einer .txt Datei, oder .csv?
    Brauche ich hier einen völlig neuen Denkansatz?

    Gruss BigOD