Что нового

Как передать в массив содержимое всех секций ini-файла

Dimmak

Знающий
Сообщения
185
Репутация
9
Есть ini-файл в котором 3 секции.
Как зачитать из него все 3 секции в один двумерный массив?? :scratch:
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Вот вариант :
Код:
#include<Array.au3>

$sIni=@ScriptDir & "\Favourities.Ini"
Dim $aData[1][2]
$sSectNames="Композиции|Альбомы|Test"

$hFile = FileOpen($sIni, 0)

If $hFile = -1 Then
    MsgBox(4096, "Ошибка", "Невозможно открыть файл.")
    Exit
EndIf

While 1
    $sLine = FileReadLine($hFile)
    If @error = -1 Then ExitLoop
 
	If StringRegExp($sLine, "\[.+?\]") Then 
		If StringRegExp($sLine, "\[(" & $sSectNames & ")\]") Then 
			$FlagAdd=True
		Else
			$FlagAdd=False
		EndIf
		ContinueLoop
	EndIf
	
	If $FlagAdd=False Then ContinueLoop
	
	ConsoleWrite ("$sLine= " & $sLine & @LF)	
	$aData[0][0]+=1
	ReDim $aData[$aData[0][0]+1][2]
	$aData[$aData[0][0]][0]=StringRegExpReplace(  $sLine, '=.+', '' )
	$aData[$aData[0][0]][1]=StringRegExpReplace(  $sLine, '.+?=', '' )
WEnd

FileClose($hFile)
_ArrayDisplay($aData)


Если считываются все секции , то установку флагов можно опустить,оставив только :
Код:
If StringRegExp($sLine, "\[.+?\]") Then ContinueLoop





Добавлено:
Сообщение автоматически объединено:

Второй вариант для случая чтения всех секций :
Код:
#include<Array.au3>
$sIni=@ScriptDir & "\Favourities.Ini"

$sText=FileRead($sIni)
$sTempText="[Temp]" & @CRLF & StringRegExpReplace($sText, "\[.+", "")

$hFile = FileOpen($sIni, 2)
FileWrite($hFile, $sTempText)
FileClose($hFile)

$aData=IniReadSection($sIni, "Temp")

$hFile = FileOpen($sIni, 2)
FileWrite($hFile, $sText)
FileClose($hFile)

_ArrayDisplay($aData)
 
Автор
Dimmak

Dimmak

Знающий
Сообщения
185
Репутация
9
Содержимое ini-файла:
Код:
[first]
a=alpha
b=beta
[second]
c=calsa
d=delta
[third]
e=elph
g=ghost

Код:
#include <Array.au3>

$aSectNames = IniReadSectionNames ( @ScriptDir & "\Ini_File.ini" )
_ArrayDisplay( $aSectNames, "")

$aArr1 = IniReadSection( @ScriptDir & "\Ini_File.ini", $aSectNames[1] )
	$iSectSize = UBound($aArr1)
$aArr2 = IniReadSection( @ScriptDir & "\Ini_File.ini", $aSectNames[2] )
$aArr3 = IniReadSection( @ScriptDir & "\Ini_File.ini", $aSectNames[3] )

#cs
_ArrayDisplay( $aArr1, "")
_ArrayDisplay( $aArr2, "")
_ArrayDisplay( $aArr3, "")
#ce


ReDim $aArr1[UBound($aArr1) + UBound($aArr2)-1][2]
	_ArrayDisplay( $aArr1, "")

For $i = $iSectSize to UBound($aArr1)-1
	$aArr1[$i][0] = $aArr2[$i -$iSectSize +1][0]
	$aArr1[$i][1] = $aArr2[$i -$iSectSize +1][1]
Next

$iSectSize = UBound($aArr1)

ReDim $aArr1[UBound($aArr1) + UBound($aArr3)-1][2]
	_ArrayDisplay( $aArr1, "")

For $i = $iSectSize to UBound($aArr1)-1
	$aArr1[$i][0] = $aArr3[$i -$iSectSize +1][0]
	$aArr1[$i][1] = $aArr3[$i -$iSectSize +1][1]
Next
	_ArrayDisplay( $aArr1, "")


Как создать в данном случае цикл, вместо $aArr1, aArr2...
For $i = 1 to 3
$aArr + $i = ...
Next
??
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Ты это хотел ?
Код:
#include<Array.au3>

$sIniFile=@ScriptDir & "\Favourities.Ini"
$aIni= IniReadAll($sIniFile)

_ArrayDisplay($aIni)

Func IniReadAll($sIni)
	$aSect=IniReadSectionNames($sIni)
	$a1=IniReadSection($sIni, $aSect [1])
	For $i=2 To UBound($aSect)-1
		$a=IniReadSection($sIni, $aSect[$i])
		For $j=1 To UBound($a)-1
			$a1[0][0]+=+1
			ReDim $a1[$a1[0][0]+1][2]
			$a1[$a1[0][0]][0]=$a[$j][0]
			$a1[$a1[0][0]][1]=$a[$j][1]
		Next
	Next
	Return $a1
EndFunc
 
Автор
Dimmak

Dimmak

Знающий
Сообщения
185
Репутация
9
Да, gregaz. :ok:
Спасибо! :IL_AutoIt_1:
8)
 
Верх