Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Считать инфу из разделов INI файла в разные массивы. (http://forum.oszone.net/showthread.php?t=164435)

FlatX007 23-01-2010 17:11 1327837

Считать инфу из разделов INI файла в разные массивы.
 
Вообщем интересует как считать инфу(все ключи и значения) из разделов INI файла в разные! массивы. По одному массиву для каждого раздела. Или в многомерный массив. Не знаю как лучше.

Я знаю как это сделать ... но если разделов 20 или 30 ... неохота для каждого прописывать.

asdf8 23-01-2010 18:18 1327889

Посмотри IniReadSectionNames и IniReadSection

FlatX007 23-01-2010 18:37 1327902

Цитата:

Цитата FlatX007
Я знаю как это сделать ... но если разделов 20 или 30 ... неохота для каждого прописывать. »


asdf8 23-01-2010 18:50 1327914

Код:

#Include <Array.au3>

$fINI= @ScriptDir & '\File.ini'

$var = IniReadSectionNames($fINI)
If Not @error Then
        Dim $ar[UBound($var)]
        For $i=1 To $var[0]
                $ar[$i]=IniReadSection($fINI,$var[$i])
                If Not @error Then _ArrayDisplay($ar[$i])
        Next
EndIf


FlatX007 23-01-2010 19:21 1327945

Во первых с ошибками и не работает ... я тоже думал просто сначало.

asdf8 23-01-2010 19:37 1327964

Цитата:

Цитата FlatX007
для каждого прописывать »

Тогда я ничего не понял: что прописывать?

Цитата:

Цитата FlatX007
Во первых с ошибками и не работает ... я тоже думал просто сначало »

$fINI - путь к ini-файлу

Creat0R 23-01-2010 22:14 1328089

Код:

#Include <Array.au3>

$sIniFile = @DesktopDir & '\File.ini'

$aSectNames = IniReadSectionNames($sIniFile)

If IsArray($aSectNames) Then
    Dim $aAllSections[$aSectNames[0]+1]

    For $i = 1 To $aSectNames[0]
        $aCurrentSection = IniReadSection($sIniFile, $aSectNames[$i])

        If Not @error Then
            $aCurrentSection[0][1] = $aSectNames[$i]
            $aAllSections[$i] = $aCurrentSection
            _ArrayDisplay($aAllSections[$i])
        EndIf
    Next
EndIf


FlatX007 23-01-2010 22:49 1328111

Ничё непонимаю ... и как мне вытащить из этого массива что либо ?

Creat0R 24-01-2010 00:15 1328180

Цитата:

Цитата FlatX007
как мне вытащить из этого массива что либо ? »

Код:

$sIniFile = @DesktopDir & '\File.ini'

$aSectNames = IniReadSectionNames($sIniFile)
If Not IsArray($aSectNames) Then Exit MsgBox(16, 'Error', 'No Sections found (or file does not exists).')

Dim $aAllSections[$aSectNames[0] + 1]
$aAllSections[0] = $aSectNames[0]

For $i = 1 To $aSectNames[0]
    $aCurrentSection = IniReadSection($sIniFile, $aSectNames[$i])

    If Not @error Then
        $aCurrentSection[0][1] = $aSectNames[$i]
        $aAllSections[$i] = $aCurrentSection
    EndIf
Next

;Вытаскиваем данные из массива массивов :)...
For $j = 1 To $aAllSections[0]
    ;Получаем массив из N-ого элемента общего массива (содержит массив в каждом элементе)
    $aCurrentSection = $aAllSections[$j]

    ;Печатаем имя секций, которое содержится в первом элементе второго измерения (это двумерный массив)
    ConsoleWrite("[" & $aCurrentSection[0][1] & "]" & @CRLF)

    ;Печатаем все ключи и их значения
    For $x = 1 To $aCurrentSection[0][0]
        ConsoleWrite($aCurrentSection[$x][0] & "=" & $aCurrentSection[$x][1] & @CRLF)
    Next

    ConsoleWrite(@CRLF)
Next


FlatX007 24-01-2010 09:53 1328284

И как мне вывести в окно сообщения (MsgBox) - первое значение, допустим, из 2 раздела (всего их 5) INI файла - что бы (MsgBox) - находился не в цикле.
Я вопрос наверно не правильно задал, мне нужно по другому.

Мне вот так нужно заполнить массив ... только у меня не работает почему-то, заполняется только последний элемент массива елементами из последней секции INI файла.

Код:

#Include <Array.au3>

;~ $sPathIni = @ScriptDir & '\Original Library\Olf.ini'
$sPathIni = @WindowsDir & "\win.ini"
$aSectionNames = IniReadSectionNames($sPathIni)

If Not (@error) Then
    For
$i = 1 To $aSectionNames[0]
        $aIniRead = IniReadSection($sPathIni, $aSectionNames[$i])
        If Not (@error) Then
            Global
$aArray[UBound($aSectionNames)][UBound($aIniRead)]
            For $i1 = 1 To $aIniRead[0][0]
                $aArray[$i][$i1] = $aIniRead[$i1][1]
            Next
        EndIf
    Next
EndIf


_ArrayDisplay($aArray)

Вообщем ничего не понятно ... и ничего не получается.

Creat0R 24-01-2010 10:34 1328298

Цитата:

Цитата FlatX007
И как мне вывести в окно сообщения (MsgBox) - первое значение, допустим, из 2 раздела (всего их 5) INI файла - что бы (MsgBox) - находился не в цикле. »

Код:

$aSecondSection = $aAllSections[2]
MsgBox(64, "", $aSecondSection[1][1])

Цитата:

Цитата FlatX007
Мне вот так нужно заполнить массив »

Это на мой взгляд сложнее для разбора.

FlatX007 24-01-2010 11:44 1328335

Цитата:

Цитата Creat0R
Это на мой взгляд сложнее для разбора. »

И всё же можно поправить мой пример ? что бы мне знать.

Creat0R 24-01-2010 13:42 1328436

Цитата:

Цитата FlatX007
И всё же можно поправить мой пример ? »

Ну он неправильный, как ты будешь различать, к какой секций относится определённое значение?

Можно сделать так например, но это может привести к достижению ограничения в размерности массива:

Код:

#Include <Array.au3>

;~ $sPathIni = @ScriptDir & '\Original Library\Olf.ini'
$sPathIni = @WindowsDir & "\win.ini"
$aSectionNames = IniReadSectionNames($sPathIni)

If Not (@error) Then
    Dim $aArray[$aSectionNames[0]+1][1]

    For $i = 1 To $aSectionNames[0]
        $aIniRead = IniReadSection($sPathIni, $aSectionNames[$i])

        If Not (@error) Then
            ReDim $aArray[$aSectionNames[0]+1][$aIniRead[0][0]+1]
            $aArray[$i][0] = $aSectionNames[$i]

            For $i1 = 1 To $aIniRead[0][0]
                $aArray[$i][$i1] = $aIniRead[$i1][1]
            Next
        EndIf
    Next

    _ArrayDisplay($aArray)
EndIf


Creat0R 24-01-2010 14:00 1328445

Или так, где имя секций повторяется для всех её значений:

Код:

#Include <Array.au3>

;~ $sPathIni = @ScriptDir & '\Original Library\Olf.ini'
$sPathIni = @WindowsDir & "\win.ini"
$aSectionNames = IniReadSectionNames($sPathIni)

If Not (@error) Then
    Dim $aArray[1][3]

    For $i = 1 To $aSectionNames[0]
        $aIniRead = IniReadSection($sPathIni, $aSectionNames[$i])

        If Not (@error) Then
            For $i1 = 1 To $aIniRead[0][0]
                $aArray[0][0] += 1
                ReDim $aArray[$aArray[0][0]+1][3]

                $aArray[$aArray[0][0]][0] = $aSectionNames[$i]
                $aArray[$aArray[0][0]][1] = $aIniRead[$i1][0]
                $aArray[$aArray[0][0]][2] = $aIniRead[$i1][1]
            Next
        EndIf
    Next

    _ArrayDisplay($aArray)
EndIf


FlatX007 24-01-2010 14:14 1328458

Цитата:

Цитата Creat0R
как ты будешь различать, к какой секций относится определённое значение? »

Так я изначально знаю какие секции будут в INI файле :), имена ключей мне не нужны, нужна секция и все значения ключей в ней.

Вот теперь то что нужно !

Andress 23-12-2010 19:42 1573072

Цитата:

Цитата Creat0R
Или так, где имя секций повторяется для всех её значений: »

Кто подскажет как работать с полученной инфой? Найти допустим Имя секций, если такое имеется то найти там параметр, если параметр существует, то считать значение параметра в переменную. имена задаются вручную,только значение параметра надо Узнать.

Creat0R 23-12-2010 19:52 1573080

Цитата:

Цитата Andress
Кто подскажет »

В этой теме никто, т.к оно не связано.

Andress 23-12-2010 20:16 1573094

Не понел юмора :) . Может тогда хоть направление какое? :(

kaster 23-12-2010 22:57 1573213

Andress, создавай новую тему. правило простое: один вопрос - одна тема


Время: 06:01.

Время: 06:01.
© OSzone.net 2001-