Войти

Показать полную графическую версию : [решено] Считать инфу из разделов INI файла в разные массивы.


FlatX007
23-01-2010, 17:11
Вообщем интересует как считать инфу(все ключи и значения) из разделов INI файла в разные! массивы. По одному массиву для каждого раздела. Или в многомерный массив. Не знаю как лучше.

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

asdf8
23-01-2010, 18:18
Посмотри IniReadSectionNames и IniReadSection

FlatX007
23-01-2010, 18:37
Я знаю как это сделать ... но если разделов 20 или 30 ... неохота для каждого прописывать. »

asdf8
23-01-2010, 18:50
#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
Во первых с ошибками и не работает ... я тоже думал просто сначало.

asdf8
23-01-2010, 19:37
для каждого прописывать »

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

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

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

Creat0R
23-01-2010, 22:14
#Include <Array.au3>

$sIniFile = @DesktopDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@DesktopDir) & '\File.ini'

$aSectNames = IniReadSectionNames (http://www.autoitscript.com/autoit3/docs/functions/IniReadSectionNames.htm)($sIniFile)

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) IsArray (http://www.autoitscript.com/autoit3/docs/functions/IsArray.htm)($aSectNames) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
Dim (http://www.autoitscript.com/autoit3/docs/keywords.htm#Dim) $aAllSections[$aSectNames[0]+1]

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aSectNames[0]
$aCurrentSection = IniReadSection (http://www.autoitscript.com/autoit3/docs/functions/IniReadSection.htm)($sIniFile, $aSectNames[$i])

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) @error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$aCurrentSection[0][1] = $aSectNames[$i]
$aAllSections[$i] = $aCurrentSection
_ArrayDisplay($aAllSections[$i])
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

FlatX007
23-01-2010, 22:49
Ничё непонимаю ... и как мне вытащить из этого массива что либо ?

Creat0R
24-01-2010, 00:15
как мне вытащить из этого массива что либо ? »

$sIniFile = @DesktopDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@DesktopDir) & '\File.ini'

$aSectNames = IniReadSectionNames (http://www.autoitscript.com/autoit3/docs/functions/IniReadSectionNames.htm)($sIniFile)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) IsArray (http://www.autoitscript.com/autoit3/docs/functions/IsArray.htm)($aSectNames) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit) MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(16, 'Error', 'No Sections found (or file does not exists).')

Dim (http://www.autoitscript.com/autoit3/docs/keywords.htm#Dim) $aAllSections[$aSectNames[0] + 1]
$aAllSections[0] = $aSectNames[0]

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aSectNames[0]
$aCurrentSection = IniReadSection (http://www.autoitscript.com/autoit3/docs/functions/IniReadSection.htm)($sIniFile, $aSectNames[$i])

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) @error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$aCurrentSection[0][1] = $aSectNames[$i]
$aAllSections[$i] = $aCurrentSection
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

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

;Печатаем имя секций, которое содержится в первом элементе второго измерения (это двумерный массив)
ConsoleWrite (http://www.autoitscript.com/autoit3/docs/functions/ConsoleWrite.htm)("[" & $aCurrentSection[0][1] & "]" & @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@CRLF))

;Печатаем все ключи и их значения
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $x = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aCurrentSection[0][0]
ConsoleWrite (http://www.autoitscript.com/autoit3/docs/functions/ConsoleWrite.htm)($aCurrentSection[$x][0] & "=" & $aCurrentSection[$x][1] & @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@CRLF))
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

ConsoleWrite (http://www.autoitscript.com/autoit3/docs/functions/ConsoleWrite.htm)(@CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@CRLF))
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

FlatX007
24-01-2010, 09:53
И как мне вывести в окно сообщения (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
И как мне вывести в окно сообщения (MsgBox) - первое значение, допустим, из 2 раздела (всего их 5) INI файла - что бы (MsgBox) - находился не в цикле. »

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

Мне вот так нужно заполнить массив »
Это на мой взгляд сложнее для разбора.

FlatX007
24-01-2010, 11:44
Это на мой взгляд сложнее для разбора. »

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

Creat0R
24-01-2010, 13:42
И всё же можно поправить мой пример ? »
Ну он неправильный, как ты будешь различать, к какой секций относится определённое значение?

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

#Include <Array.au3>

;~ $sPathIni = @ScriptDir & '\Original Library\Olf.ini'
$sPathIni = @WindowsDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@WindowsDir) & "\win.ini"
$aSectionNames = IniReadSectionNames (http://www.autoitscript.com/autoit3/docs/functions/IniReadSectionNames.htm)($sPathIni)

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) (@error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error)) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
Dim (http://www.autoitscript.com/autoit3/docs/keywords.htm#Dim) $aArray[$aSectionNames[0]+1][1]

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aSectionNames[0]
$aIniRead = IniReadSection (http://www.autoitscript.com/autoit3/docs/functions/IniReadSection.htm)($sPathIni, $aSectionNames[$i])

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) (@error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error)) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
ReDim (http://www.autoitscript.com/autoit3/docs/keywords.htm#ReDim) $aArray[$aSectionNames[0]+1][$aIniRead[0][0]+1]
$aArray[$i][0] = $aSectionNames[$i]

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i1 = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aIniRead[0][0]
$aArray[$i][$i1] = $aIniRead[$i1][1]
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

_ArrayDisplay($aArray)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

Creat0R
24-01-2010, 14:00
Или так, где имя секций повторяется для всех её значений:

#Include <Array.au3>

;~ $sPathIni = @ScriptDir & '\Original Library\Olf.ini'
$sPathIni = @WindowsDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@WindowsDir) & "\win.ini"
$aSectionNames = IniReadSectionNames (http://www.autoitscript.com/autoit3/docs/functions/IniReadSectionNames.htm)($sPathIni)

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) (@error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error)) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
Dim (http://www.autoitscript.com/autoit3/docs/keywords.htm#Dim) $aArray[1][3]

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aSectionNames[0]
$aIniRead = IniReadSection (http://www.autoitscript.com/autoit3/docs/functions/IniReadSection.htm)($sPathIni, $aSectionNames[$i])

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) (@error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error)) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i1 = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aIniRead[0][0]
$aArray[0][0] += 1
ReDim (http://www.autoitscript.com/autoit3/docs/keywords.htm#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 (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

_ArrayDisplay($aArray)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

FlatX007
24-01-2010, 14:14
как ты будешь различать, к какой секций относится определённое значение? »

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

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

Andress
23-12-2010, 19:42
Или так, где имя секций повторяется для всех её значений: »
Кто подскажет как работать с полученной инфой? Найти допустим Имя секций, если такое имеется то найти там параметр, если параметр существует, то считать значение параметра в переменную. имена задаются вручную,только значение параметра надо Узнать.

Creat0R
23-12-2010, 19:52
Кто подскажет »
В этой теме никто, т.к оно не связано.

Andress
23-12-2010, 20:16
Не понел юмора :) . Может тогда хоть направление какое? :(

kaster
23-12-2010, 22:57
Andress, создавай новую тему. правило простое: один вопрос - одна тема




© OSzone.net 2001-2012