다른 명령
- AutoIt에서 INI 파일 데이터를 HashMap처럼 메모리에 저장하고 빠르게 검색하려면, 데이터를 읽어서 메모리에 로드하고, 이를 키-값 구조로 관리하는 것이 필요합니다.
- AutoIt 자체적으로 HashMap 자료구조를 제공하지 않으므로, 2차원 배열 또는 **딕셔너리(UDF)**로 대체할 수 있습니다.
2차원 배열을 이용한 INI 데이터 관리
- 이 방법은 간단히 데이터를 메모리에 로드하고 검색할 수 있도록 구현합니다.
#include <Array.au3> ; INI 파일 데이터를 배열로 메모리에 로드 Local $sINIFile = "settings.ini" ; INI 파일 경로 Local $aData = _LoadINIToArray($sINIFile) ; 검색 Local $sValue = _SearchKey($aData, "Username") If $sValue <> "" Then MsgBox(0, "Search Result", "Username: " & $sValue) Else MsgBox(16, "Error", "Key not found!") EndIf ; 함수: INI 데이터를 배열로 로드 Func _LoadINIToArray($sFile) Local $aResult[0][2] If Not FileExists($sFile) Then Return $aResult Local $sContent = FileRead($sFile) Local $aLines = StringSplit($sContent, @CRLF, 1) For $i = 1 To $aLines[0] Local $aKeyValue = StringSplit($aLines[$i], "=") If $aKeyValue[0] = 2 Then ReDim $aResult[UBound($aResult) + 1][2] $aResult[UBound($aResult) - 1][0] = $aKeyValue[1] $aResult[UBound($aResult) - 1][1] = $aKeyValue[2] EndIf Next Return $aResult EndFunc ; 함수: 배열에서 키 검색 Func _SearchKey(ByRef $aArray, $sKey) For $i = 0 To UBound($aArray) - 1 If $aArray[$i][0] = $sKey Then Return $aArray[$i][1] EndIf Next Return "" EndFunc
{{틀:요약 1. _LoadINIToArray: • INI 파일 데이터를 읽어서 [키][값] 구조의 2차원 배열에 저장합니다. • 배열은 메모리에 유지되어 검색이 빠릅니다.
2. _SearchKey: • 배열에서 특정 키를 검색하고, 해당 키의 값을 반환합니다.
3. 실행 예제: • settings.ini 파일의 내용이 다음과 같다고 가정:
Username=User1 Theme=Dark AutoSave=true
• 검색 결과: "Username: User1"이 출력됩니다.
}}
딕셔너리(UDF)를 사용한 INI 데이터 관리
- 딕셔너리를 사용하면 키-값 쌍을 더 직관적으로 관리할 수 있습니다. AutoIt에서 딕셔너리를 사용하려면 UDF를 사용해야 합니다.
#include "Dictionary.au3" ; Dictionary UDF 필요 (https://www.autoitscript.com/forum/topic/123636-dictionary-udf/) ; 딕셔너리 생성 Local $oDict = _DictCreate() ; INI 파일 데이터를 딕셔너리에 로드 Local $sINIFile = "settings.ini" _LoadINIToDict($sINIFile, $oDict) ; 검색 Local $sValue = _DictGet($oDict, "Username") If Not @error Then MsgBox(0, "Search Result", "Username: " & $sValue) Else MsgBox(16, "Error", "Key not found!") EndIf ; 함수: INI 데이터를 딕셔너리에 로드 Func _LoadINIToDict($sFile, ByRef $oDict) If Not FileExists($sFile) Then Return Local $sContent = FileRead($sFile) Local $aLines = StringSplit($sContent, @CRLF, 1) For $i = 1 To $aLines[0] Local $aKeyValue = StringSplit($aLines[$i], "=") If $aKeyValue[0] = 2 Then _DictAdd($oDict, $aKeyValue[1], $aKeyValue[2]) EndIf Next EndFunc
{{틀:요약 1. Dictionary UDF: • Dictionary.au3 라이브러리를 추가하여 딕셔너리를 사용합니다. • https://www.autoitscript.com/forum/topic/123636-dictionary-udf/에서 다운로드 가능합니다.
2. _LoadINIToDict: • INI 파일 데이터를 키-값 쌍으로 딕셔너리에 저장합니다. 3. _DictGet: • 키를 검색하고 값을 반환합니다. 키가 없으면 오류를 반환합니다. </source>
SQLite 데이터베이스를 활용
- INI 데이터를 SQLite 데이터베이스에 로드하여 효율적으로 관리할 수도 있습니다.
#include <SQLite.au3> #include <SQLite.dll.au3> ; SQLite 초기화 _SQLite_Startup() Local $hDB = _SQLite_Open(":memory:") ; 테이블 생성 및 데이터 삽입 _SQLite_Exec($hDB, "CREATE TABLE Settings (Key TEXT PRIMARY KEY, Value TEXT)") _SQLite_Exec($hDB, "INSERT INTO Settings (Key, Value) VALUES ('Username', 'User1')") _SQLite_Exec($hDB, "INSERT INTO Settings (Key, Value) VALUES ('Theme', 'Dark')") ; 데이터 검색 Local $hQuery, $sValue _SQLite_Query($hDB, "SELECT Value FROM Settings WHERE Key = 'Username'", $hQuery) If _SQLite_FetchData($hQuery, $sValue) Then MsgBox(0, "Search Result", "Username: " & $sValue) Else MsgBox(16, "Error", "Key not found!") EndIf _SQLite_CloseQuery($hQuery) ; 종료 _SQLite_Close($hDB) _SQLite_Shutdown()
{{틀:요약
- 간단한 데이터:
- 2차원 배열 또는 딕셔너리 사용.
- 복잡한 구조화 데이터:
- SQLite 데이터베이스 사용.
}}