메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

Ini 파일 읽어서 2차원 배열로 저장

데브카페

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)

설명

  1. _ReadIniToArray($sFilePath) 함수:
    1. 이 함수는 INI 파일 경로를 인자로 받아 2차원 배열을 반환합니다.
    2. Local $aIniData[1][2]로 초기 배열을 선언합니다. ReDim을 사용하여 필요한 만큼 동적으로 크기를 확장할 것입니다.
    3. FileExists($sFilePath)로 파일 존재 여부를 확인합니다.
    4. FileOpen($sFilePath, 0)으로 파일을 읽기 모드로 엽니다.
    5. While Not FileReadEOF($hFile) 루프를 사용하여 파일을 한 줄씩 읽습니다.
    6. StringStripWS($sLine, 3)를 사용하여 각 줄의 앞뒤 공백을 제거합니다.
  2. 섹션 처리:
    1. If StringLeft($sLine, 1) = "[" And StringRight($sLine, 1) = "]" Then 조건으로 줄이 섹션인지 확인합니다.
    2. 섹션이면 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부터 시작하는 것이 일반적입니다.

개선 사항

  1. 값도 포함: 만약 키뿐만 아니라 해당 키의 값도 2차원 배열에 저장하고 싶다면, 배열의 차원을 3으로 늘려 $aIniData[$iIndex][2]에 값을 저장하거나, 또는 섹션과 키를 포함하는 새로운 UDT (User Defined Type)를 정의하여 배열에 저장하는 방법도 고려할 수 있습니다.
  2. 빈 라인 또는 주석 처리: 현재 코드는 빈 라인이나 ;으로 시작하는 주석 라인을 자동으로 건너뛰므로 특별히 처리할 필요는 없습니다.
  3. 오류 처리 강화: 파일 열기 실패, 읽기 실패 등 추가적인 오류 처리를 할 수 있습니다.

이 코드는 AutoIt에서 INI 파일의 섹션과 키를 효율적으로 2차원 배열로 구성하는 방법을 제공합니다.

Comments