Что нового

[Изменение функции] Работа IniRead с пустой строкой в параметре section

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Сейчас функция IniRead
http://autoit-script.ru/autoit3_docs/functions/IniRead.htm
обязательно требует указания секции в параметрах.
Предлагаю внести следующие правки в работу функции:
при уазании путой строки в качестве параметра section, функция ищет указанный параметр во всём ini-файле. Если таких параметров несколько (в разных секциях, например), то возвращает первый найденный.

Это позволит:
- обрабатывать ini-файлы не разделённые на секции;
- производить глобальный поиск парамтра, не зная названия секции.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
C2H5OH
а для чего это нужно? :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
C2H5OH,
А если примерно так?
Код:
#include <Array.au3>

$sKey = 'key2'
$sText = FileRead(@ScriptDir & '\test.ini')
$aText = StringRegExp($sText, '(?m)^' & $sKey & '=(.*?)\r?$', 3)
_ArrayDisplay($aText)
ConsoleWrite($sKey & ' = ' & $aText[0] & @LF)
Файл test.ini:
Код:
key1=1
key2=2
key3=3
key4=4
key5=5
key2=22
 
Автор
C2H5OH

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
joiner,
Это позволит:
- обрабатывать ini-файлы не разделённые на секции;
- производить глобальный поиск парамтра, не зная названия секции.

madmasles,
Да, но ты написал альтернативу функции IniRead. Можно использовать твой код и про IniRead забыть. Но такая функция в AutoIt всё же есть. И я предлагаю её усовершенствовать.
 

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
C2H5OH [?]
Но такая функция в AutoIt всё же есть. И я предлагаю её усовершенствовать.
Скажи это WinAPI...
OffTopic:

GetPrivateProfileInt
GetPrivateProfileSection
GetPrivateProfileSectionNames
GetPrivateProfileString
GetPrivateProfileStruct
GetProfileInt
GetProfileSection
GetProfileString
WritePrivateProfileSection
WritePrivateProfileString
WritePrivateProfileStruct
WriteProfileSection
WriteProfileString
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
C2H5OH
ну, вообще говоря, хоть ini файл и является всего лишь текстовым файлом, существует негласный формат записи для них - а именно
Код:
[Section1]
key1 = value1
key2 = value2
...
keyN =valueN
[Section2]
key1 = value1
key2 = value2
...
keyN =valueN
...
[SectionM]
key1 = value1
key2 = value2
...
keyN =valueN
где каждый ключ в пределах секции и каждая секция - уникальны. то, что предлагаешь обрабатывать ты, строго говоря ini не является, а следовательно, обрабатываться Ini... функциями не обязана :smile:
но в целом, лучше действительно создать свой парсер для самых разных файлов, хоть ini, хоть csv, tsv и тд. и иметь полный контроль :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
C2H5OH [?]
Это позволит:
- обрабатывать ini-файлы не разделённые на секции;
- производить глобальный поиск парамтра, не зная названия секции.

Я уже давно использую это:
Код:
_IniFileWriteValue("Test.ini", "Key", "Value")

$sVal = _IniFileReadValue("Test.ini", "Key", "Error")
MsgBox(64, 'Title', $sVal)

Func _IniFileWriteValue($sFile, $sKey, $sValue)
	Local $sReadFile = FileRead($sFile)
	If $sReadFile = "" Then Return FileWriteLine($sFile, $sKey & "=" & $sValue)
	
	Local $aReadFileArr = StringSplit(StringStripCR($sReadFile), @LF)
	Local $iUbound = UBound($aReadFileArr)-1, $sCurrentLine, $iKeyIsWritten = 0, $sCRLF = @CRLF
	Local $iKeyLen = StringLen($sKey)
	
	Local $hFileOpenW = FileOpen($sFile, 8 + 2)
	If $hFileOpenW = -1 Then Return SetError(1, 0, -1)
	
	For $i = 1 To $iUbound
		$sCurrentLine = StringStripWS($aReadFileArr[$i], 7)
		If $i = $iUbound Then $sCRLF = ""
		
		If StringLeft($aReadFileArr[$i], $iKeyLen+1) = $sKey & "=" Then
			$iKeyIsWritten = 1
			FileWrite($hFileOpenW, $sKey & "=" & $sValue & $sCRLF)
		Else
			FileWrite($hFileOpenW, $aReadFileArr[$i] & $sCRLF)
		EndIf
	Next
	
	If Not $iKeyIsWritten Then FileWriteLine($hFileOpenW, $sKey & "=" & $sValue)
	
	Return FileClose($hFileOpenW)
EndFunc

Func _IniFileReadValue($sFile, $sKey, $sDefault = "")
	Local $sReadFile, $aReadFileArr, $iKeyLen
	
	$sReadFile = FileRead($sFile)
	$aReadFileArr = StringSplit(StringStripCR($sReadFile), @LF)
	$iKeyLen = StringLen($sKey)
	
	For $i = 1 To $aReadFileArr[0]
		If StringLeft($aReadFileArr[$i], $iKeyLen+1) = $sKey & "=" Then
			Return StringTrimLeft($aReadFileArr[$i], $iKeyLen+1)
		EndIf
	Next
	
	Return $sDefault
EndFunc
 
Верх