다른 명령
Ini 파일 읽어서 2차원 배열로 저장
- AutoIt에서 INI 파일을 읽어서 섹션과 키를 포함하는 2차원 배열을 만드는 방법
#include <Array.au3> ; 배열 관련 함수
Func _ReadIniToArray($sFilePath)
Local $aIniData[1][2] ; 초기 2차원 배열 선언 (나중에 ReDim으로 확장)
; $aIniData[0][0] = 섹션, $aIniData[0][1] = 키 (샘플 초기값)
Local $iIndex = 0
If Not FileExists($sFilePath) Then
ConsoleWrite("오류: '" & $sFilePath & "' 파일을 찾을 수 없습니다." & @CRLF)
Return SetError(1, 0, "")
EndIf
; INI 파일을 한 줄씩 읽습니다.
Local $hFile = FileOpen($sFilePath, 0) ; 0 = 읽기 모드
If $hFile = -1 Then
ConsoleWrite("오류: '" & $sFilePath & "' 파일을 열 수 없습니다." & @CRLF)
Return SetError(2, 0, "")
EndIf
Local $sCurrentSection = ""
While Not FileReadEOF($hFile)
Local $sLine = StringStripWS(FileReadLine($hFile), 3) ; 공백 제거
If StringLeft($sLine, 1) = "[" And StringRight($sLine, 1) = "]" Then
; 섹션 발견
$sCurrentSection = StringMid($sLine, 2, StringLen($sLine) - 2)
$iIndex += 1
ReDim $aIniData[$iIndex + 1][2] ; 배열 크기 확장
$aIniData[$iIndex][0] = $sCurrentSection
$aIniData[$iIndex][1] = "" ; 섹션만 있는 경우 키는 비워둡니다.
ElseIf StringInStr($sLine, "=") Then
; 키-값 쌍 발견
If $sCurrentSection <> "" Then
Local $aKeyValue = StringSplit($sLine, "=", 2) ; 2 = 빈 문자열 포함 안함
If UBound($aKeyValue) = 2 Then
$iIndex += 1
ReDim $aIniData[$iIndex + 1][2] ; 배열 크기 확장
$aIniData[$iIndex][0] = $sCurrentSection
$aIniData[$iIndex][1] = $aKeyValue[1]
; Note: 값을 포함하려면 $aIniData[$iIndex][2]에 저장하거나
; 배열의 차원을 3으로 확장해야 합니다.
; 이 예제에서는 섹션과 키만 저장합니다.
EndIf
EndIf
EndIf
Wend
FileClose($hFile)
; 첫 번째 (0번째) 행은 빈 초기값이므로 제거하거나 조정합니다.
; 여기서는 1부터 유효한 데이터가 시작한다고 가정합니다.
; 만약 0부터 유효한 데이터를 시작하려면 $aIniData[0][0], $aIniData[0][1]부터 채우면 됩니다.
; 이 예제에서는 유효한 데이터를 $aIniData[1][...] 부터 저장합니다.
; 실제 데이터는 1부터 $iIndex까지입니다.
; 필요에 따라 배열의 크기를 조정합니다.
ReDim $aIniData[$iIndex + 1][2] ; 실제 데이터가 있는 부분까지만 재조정 (선택 사항)
Return $aIniData
EndFunc
사용 예제
; 테스트용 INI 파일 생성 (실제 파일로 대체 가능)
Local $sIniFile = @ScriptDir & "\MySettings.ini"
Local $sContent = "[General]" & @CRLF & _
"Name=AutoIt" & @CRLF & _
"Version=3.3" & @CRLF & _
"" & @CRLF & _
"[Network]" & @CRLF & _
"IPAddress=192.168.1.1" & @CRLF & _
"Port=8080" & @CRLF
FileDelete($sIniFile) ; 기존 파일 삭제 (테스트용)
FileWrite($sIniFile, $sContent)
Local $aResult = _ReadIniToArray($sIniFile)
If @error = 0 Then
ConsoleWrite("INI 파일 읽기 성공!" & @CRLF)
; 배열 내용 출력
For $i = 1 To UBound($aResult) - 1 ; 1부터 유효한 데이터 시작
ConsoleWrite("섹션: " & $aResult[$i][0] & ", 키: " & $aResult[$i][1] & @CRLF)
Next
Else
ConsoleWrite("INI 파일 읽기 실패. 오류 코드: " & @error & @CRLF)
EndIf
; 테스트용 INI 파일 삭제 (선택 사항)
; FileDelete($sIniFile)
설명
- _ReadIniToArray($sFilePath) 함수:
- 이 함수는 INI 파일 경로를 인자로 받아 2차원 배열을 반환합니다.
- Local $aIniData[1][2]로 초기 배열을 선언합니다. ReDim을 사용하여 필요한 만큼 동적으로 크기를 확장할 것입니다.
- FileExists($sFilePath)로 파일 존재 여부를 확인합니다.
- FileOpen($sFilePath, 0)으로 파일을 읽기 모드로 엽니다.
- While Not FileReadEOF($hFile) 루프를 사용하여 파일을 한 줄씩 읽습니다.
- StringStripWS($sLine, 3)를 사용하여 각 줄의 앞뒤 공백을 제거합니다.
- 섹션 처리:
- If StringLeft($sLine, 1) = "[" And StringRight($sLine, 1) = "]" Then 조건으로 줄이 섹션인지 확인합니다.
- 섹션이면 StringMid($sLine, 2, StringLen($sLine) - 2)를 사용하여 대괄호를 제거하고 섹션 이름을 추출합니다.
- ReDim $aIniData[$iIndex + 1][2]를 사용하여 배열의 행을 하나 확장하고, $aIniData[$iIndex][0]에 섹션 이름을 저장합니다. $aIniData[$iIndex][1]은 섹션만 있는 경우를 위해 비워둡니다.
* 키-값 쌍 처리: * ElseIf StringInStr($sLine, "=") 조건으로 줄이 키-값 쌍인지 확인합니다. * StringSplit($sLine, "=", 2)를 사용하여 키와 값을 분리합니다. 2는 빈 문자열을 포함하지 않도록 합니다. * UBound($aKeyValue) = 2를 확인하여 키와 값이 모두 제대로 분리되었는지 확인합니다. * ReDim $aIniData[$iIndex + 1][2]로 배열을 확장하고, $aIniData[$iIndex][0]에 현재 섹션 이름, $aIniData[$iIndex][1]에 키 이름을 저장합니다. * 주의: 이 예제에서는 키만 2차원 배열에 저장하고 있습니다. 만약 값도 저장하고 싶다면 배열의 차원을 3으로 확장하거나, 값을 저장할 다른 방법을 고려해야 합니다 (예: _ReadIniToArray 함수 내에서 섹션-키-값 매핑을 위한 맵 또는 연관 배열 사용). * 배열 반환 및 사용 예제: * 함수는 최종적으로 채워진 2차원 배열 $aIniData를 반환합니다. * 사용 예제에서는 임시 INI 파일을 생성하여 함수를 테스트하고 결과를 콘솔에 출력합니다. * For $i = 1 To UBound($aResult) - 1 루프를 사용하여 배열 내용을 순회하며 출력합니다. 배열의 0번째 인덱스는 초기 선언 시의 빈 값이므로 1부터 시작하는 것이 일반적입니다.
개선 사항
- 값도 포함: 만약 키뿐만 아니라 해당 키의 값도 2차원 배열에 저장하고 싶다면, 배열의 차원을 3으로 늘려 $aIniData[$iIndex][2]에 값을 저장하거나, 또는 섹션과 키를 포함하는 새로운 UDT (User Defined Type)를 정의하여 배열에 저장하는 방법도 고려할 수 있습니다.
- 빈 라인 또는 주석 처리: 현재 코드는 빈 라인이나 ;으로 시작하는 주석 라인을 자동으로 건너뛰므로 특별히 처리할 필요는 없습니다.
- 오류 처리 강화: 파일 열기 실패, 읽기 실패 등 추가적인 오류 처리를 할 수 있습니다.
이 코드는 AutoIt에서 INI 파일의 섹션과 키를 효율적으로 2차원 배열로 구성하는 방법을 제공합니다.