IniReadSection in Array einlesen.

  • Hi,
    ich denke, der Quellcode sagt mehr aus als die Überschrift:

    [autoit]


    $ininames = IniReadSectionNames ($dateiname)

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

    For $i_sektionsnamen = 1 To $ininames[0]
    $ini[$i_sektionsnamen] = IniReadSection ($dateiname,$ininames[$i_sektionsnamen]) ; HIER liegt der Hund begraben!
    Next

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

    For $i_sektionsnamen = 1 To $ininames[0] Step 1 ;schleife für Sektionen
    For $i_schluessel = 1 To $ini[$i_sektionsnamen][0][0] Step 1 ;schleife für Schlüssel innerhalb der Sektionen
    GUICtrlSetData ($List1,$ini[$i_sektionsnamen][$i_schluessel][0]&"|") ;die schlüssel sollen hier in eine GuictrlcreateList eingetragen werden.
    Next
    Next

    [/autoit]

    Wie man vielleicht sieht, möchte ich IniReadSection, was ja schon eine 2D Array ist, in ein weiteres Array einsetzen.
    Funktioniert aber nicht, weil AutoIt so "blöd ist" :P und denkt, ich würde mit der Zeile

    [autoit]

    $ini[$i] = IniReadSection ($dateiname,$ininames[$i])

    [/autoit]

    ein 1D Array erstellen wollen, obwohl es als 3D deklariert wurde.

    Hat jemand ne Idee wie ich meinem Script das beibrigen?

    MfG, MAB_Commander

    Einmal editiert, zuletzt von MAB_Commander (28. April 2010 um 19:59)

  • Ich weiß nicht wie ich 1D und 3D erklären soll^^
    Und alle Key Value Paare in 2D einlesen geht nicht wegen folgendem Satz, der in der Hilfe zu finden ist:

    Zitat

    Funktion IniReadSection: Nur die ersten 32767 Zeichen werden aufgrund der Win9x-Kompatibilität in einer Sektion berücksichtigt.

  • Verstehe ich nicht, ist die ini zu groß? ?(
    Wie soll die .ini denn dargestellt werden? Als 2D Array? 1D Array?

    Vielleicht hilft das hier? FileWriteFromArray2D

    edit \ Hier noch ein Bsp: mit Listview und Gruppen, lässt sich leicht auf eine Liste abändern:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #include <File.au3>

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

    Global $ini = @ScriptDir & "\dvb-tools.ini" ;Pfad zur ini

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

    $Form1 = GUICreate("Ini read to Listview - Beispiel", 700, 500, -1, -1)
    $ListView1 = GUICtrlCreateListView("", 20, 20, 660, 350)
    $hlistview = GUICtrlGetHandle($ListView1)
    _GUICtrlListView_AddColumn($hlistview, "Key", 200)
    _GUICtrlListView_AddColumn($hlistview, "Value", 450)

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

    $Button2 = GUICtrlCreateButton("Iniread", 20, 420, 120, 33, 0)
    $Button1 = GUICtrlCreateButton("Add", 220, 420, 120, 33, 0)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button2
    _Initolistview($hlistview, $ini)
    Case $Button1
    _Add()
    EndSwitch
    WEnd

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

    Func _Initolistview($hwnd, $path)
    ; nuts (http://www.autoit.de)
    ; $hwnd = Handle to the listview
    ; $path = ini path
    Local $anames, $aread
    If Not IsHWnd($hwnd) Then
    SetError(1,0,1) ;not a handle -> @error = 1
    Return
    ElseIf Not FileExists($path) Then
    SetError(1,0,2) ;ini not found -> @error = 2
    Return
    EndIf
    $anames = IniReadSectionNames($path)
    $counter = -1;_GUICtrlListView_GetItemCount($hwnd)
    For $i = 1 To $anames[0]
    $aread = IniReadSection($path, $anames[$i])
    If @error Then
    $counter += 1
    _GUICtrlListView_EnableGroupView($hwnd)
    _GUICtrlListView_InsertGroup($hwnd, -1, $i, $anames[$i])
    _GUICtrlListView_AddItem($hwnd, "Kein Eintrag")
    _GUICtrlListView_SetItemGroupID($hwnd, $counter, $i)
    ContinueLoop
    EndIf
    _GUICtrlListView_EnableGroupView($hwnd)
    _GUICtrlListView_InsertGroup($hwnd, -1, $i, $anames[$i])
    For $x = 1 To $aread[0][0]
    $counter += 1
    _GUICtrlListView_AddItem($hwnd, $aread[$x][0])
    _GUICtrlListView_AddSubItem($hwnd, $counter, $aread[$x][1], 1)
    _GUICtrlListView_SetItemGroupID($hwnd, $counter, $i)
    Next

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

    Next
    EndFunc ;==>_Initolistview

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

    Func _Add()
    #region ### START Koda GUI section ### Form=
    $Form2 = GUICreate("Form1", 431, 200, 192, 124)
    $Input1 = GUICtrlCreateInput("", 40, 64, 113, 21)
    $Input2 = GUICtrlCreateInput("", 192, 64, 177, 21)
    $Label1 = GUICtrlCreateLabel("Key", 40, 32, 36, 17)
    $Label2 = GUICtrlCreateLabel("Value", 192, 32, 36, 17)
    $Button = GUICtrlCreateButton("Übernehmen", 140, 150, 120, 33, 0)
    GUISetState(@SW_HIDE, $Form1)
    GUISetState(@SW_SHOW, $Form2)
    #endregion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    GUIDelete($Form2)
    GUISetState(@SW_SHOW, $Form1)
    ExitLoop
    case $Button
    local $count
    _GUICtrlListView_AddItem($hlistview,GUICtrlRead($Input1))
    local $count=_GUICtrlListView_GetItemCount($hlistview)-1
    _GUICtrlListView_AddSubItem($hlistview,$count,GUICtrlRead($Input1),1)
    _GUICtrlListView_SetItemGroupID($hlistview,$count,1)
    GUIDelete($Form2)
    GUISetState(@SW_SHOW, $Form1)
    ExitLoop
    EndSwitch
    WEnd
    EndFunc ;==>_Add

    [/autoit]

    3 Mal editiert, zuletzt von nuts (26. April 2010 um 10:21)

  • Soll dein Array folgendermaßen aussehen. Erste Spalte Sektionsnamen, zweite Spalte Schlüssel und dritte Spalte Wert?

  • Ich weiß nicht, ob dir das bewusst ist, aber AutoIt macht alles richtig. Du speicherst nämlich die 2D Arrays von IniReadSection IN dem 1D Array. Um mit diesen zu arbeiten, musst du sie erst in einen Dummy Array schreiben.

    Spoiler anzeigen
    [autoit]

    ;....

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

    $ininames = IniReadSectionNames ($dateiname)

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

    For $i_sektionsnamen = 1 To $ininames[0]
    $ini[$i_sektionsnamen] = IniReadSection ($dateiname,$ininames[$i_sektionsnamen]) ; HIER liegt der Hund begraben!
    Next

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

    For $i_sektionsnamen = 1 To $ininames[0]
    $aDummy = $ini[$i_sektionsnamen]
    _ArrayDisplay($aDummy)
    Next

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

    ;....

    [/autoit]
  • Ah, das mit dem Dummy Array kannte ich vorher nicht.
    Probier ich nacher mal aus. Aber da wo du den Dummy einbringst gibt es keine Probleme. Wenn dann muss das weiter oben geschehen.

    @m-obi: Ganz genau so soll es aussehen.
    nuts: Mit dem ListView und Co. habe ich keine Probleme.

    Habe es schon auf eine andere Art und weise geschafft, ist aber sehr langsam.
    Wenn ich 50.000 Werte in die Liste lade dauert das ein Paar minuten.
    Hoffe das es mit der Dummy Array schneller geht.

    MfG, MAB_Commander

    Edit: Ich stand total auf'm schlauch^^

    Zitat

    Du speicherst nämlich die 2D Arrays von IniReadSection IN dem 1D Array.

    Genau das möchte ich ja, nur ging es nicht, weil ich beide Variablen gleich genannt habe.
    Ich brauche denen also nur verschiedene namen geben.

    Allerdings finde ich weder in der Hilfe, noch im Internet etwas Hilfreiches über Dummy-Arrays...

  • In etwa so?

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Global $aIni[1][3] = [["- Sektion -", "- Schlüssel -", "- Wert -"]]

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

    _ArrayDisplay($aIni)

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

    $sFile = @ScriptDir & "\Daten.ini"

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

    $aIniSectionNames = IniReadSectionNames($sFile)

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

    For $i = 1 To $aIniSectionNames[0]
    $aIniSection = IniReadSection($sFile, $aIniSectionNames[$i])
    For $k = 1 To $aIniSection[0][0]
    ReDim $aIni[UBound($aIni) + 1][3]
    $aIni[UBound($aIni) - 1][0] = $aIniSectionNames[$i]
    $aIni[UBound($aIni) - 1][1] = $aIniSection[$k][0]
    $aIni[UBound($aIni) - 1][2] = $aIniSection[$k][1]
    Next
    Next

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

    _ArrayDisplay($aIni)

    [/autoit]

    Musst dann nur noch $sFile ändern, weiß ja nicht wie sie bei dir heisst.