Автор Тема: Как передать в массив содержимое всех секций ini-файла  (Прочитано 2840 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Dimmak [?]

  • Новичок
  • *
  • Сообщений: 172
  • Репутация: 9
    • Награды
  • Версия AutoIt: 3.3.12.0
Есть ini-файл в котором 3 секции.
Как зачитать из него все 3 секции в один двумерный массив??  :think:
ДОСТИЖЕНИЮ ИЗБРАННОЙ ЦЕЛИ может мешать другой вариант выбора...
  Но именно другие, ТОЧНЫЕ варианты выбора,
являются ПОСЛЕДОВАТЕЛЬНЫМИ звеньями той цепи,
которая и приводит к ДОСТИЖЕНИЮ ИЗБРАННОЙ ЦЕЛИ.

Русское сообщество AutoIt


Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166
  • Репутация: 298
  • Пол: Мужской
    • Награды
Вот вариант :
Код: AutoIt [Выделить]
#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)
 


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





Добавлено: Март 10, 2012, 02:51:40
Второй вариант для случая чтения всех секций :
Код: AutoIt [Выделить]
#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)
 

« Последнее редактирование: Март 10, 2012, 02:53:08 от gregaz, Причина: Объединение сообщений »
Самая большая проблема – её сформулировать. 

Оффлайн Dimmak [?]

  • Новичок
  • *
  • Сообщений: 172

  • Автор темы
  • Репутация: 9
    • Награды
  • Версия AutoIt: 3.3.12.0
Содержимое ini-файла:
[first]
a=alpha
b=beta
[second]
c=calsa
d=delta
[third]
e=elph
g=ghost

Код: AutoIt [Выделить]
#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
??
« Последнее редактирование: Март 10, 2012, 04:56:38 от Dimmak »

Русское сообщество AutoIt

Re: Как передать в массив содержимое всех секций ini-файла
« Ответ #2 Отправлен: Март 10, 2012, 04:49:55 »

Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166
  • Репутация: 298
  • Пол: Мужской
    • Награды
Ты это хотел ?
Код: AutoIt [Выделить]
#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 [?]

  • Новичок
  • *
  • Сообщений: 172

  • Автор темы
  • Репутация: 9
    • Награды
  • Версия AutoIt: 3.3.12.0
Да, gregaz:ok:
Спасибо!  :IL_AutoIt_1:
 8)

Русское сообщество AutoIt

Re: Как передать в массив содержимое всех секций ini-файла
« Ответ #4 Отправлен: Март 10, 2012, 13:33:48 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
2 Ответов
4713 Просмотров
Последний ответ Ноябрь 11, 2011, 03:36:50
от AZJIO
0 Ответов
2313 Просмотров
Последний ответ Ноябрь 11, 2011, 01:35:31
от Kaster
5 Ответов
2158 Просмотров
Последний ответ Июнь 16, 2013, 14:43:06
от Spyhunter
10 Ответов
3837 Просмотров
Последний ответ Июль 21, 2013, 16:49:51
от Astel064
4 Ответов
2285 Просмотров
Последний ответ Июль 02, 2015, 10:40:13
от madmasles
40 Ответов
6963 Просмотров
Последний ответ Сентябрь 02, 2015, 23:36:02
от iamOmg
0 Ответов
570 Просмотров
Последний ответ Август 22, 2015, 16:06:03
от madmasles
2 Ответов
2809 Просмотров
Последний ответ Октябрь 26, 2015, 09:53:16
от Andrey_A
5 Ответов
945 Просмотров
Последний ответ Октябрь 21, 2017, 02:42:06
от Garrett
7 Ответов
502 Просмотров
Последний ответ Май 30, 2019, 16:16:54
от joiner