ETC/Auto Hotkey

AutoHotkey 스크립팅의 핵심: 텍스트 및 데이터 구문 분석 마스터하기

shimdh 2025. 10. 28. 14:12
728x90

AutoHotkey는 단순한 키보드 매크로 도구를 넘어, 강력한 자동화 스크립팅 언어로 자리 잡았습니다. 하지만 그 진정한 힘은 외부 데이터와의 상호 작용에서 드러납니다. 특히 텍스트 및 데이터 구문 분석(parsing) 은 복잡한 문자열을 세밀한 조각으로 분해하고, 유용한 정보를 추출하는 데 핵심입니다. 이 기술을 익히면 파일 읽기, 데이터 처리, 로그 분석 등 일상적인 작업을 자동화하여 생산성을 폭발적으로 높일 수 있습니다. 이 글에서는 구문 분석의 기본 개념부터 AutoHotkey 실전 예시, 그리고 마스터 팁까지 단계적으로 탐구해 보겠습니다. 초보자도 쉽게 따라할 수 있도록 코드 예제를 풍부하게 준비했습니다.

728x90

구문 분석이란 무엇이며 왜 중요한가요?

구문 분석은 원시 텍스트나 입력 데이터를 분석하여 의미 있는 정보를 추출하는 과정입니다. 프로그래밍 관점에서 보면, 무질서한 문자열을 배열, 변수, 또는 구조화된 객체로 변환하는 작업을 의미하죠. 이는 AutoHotkey 스크립트가 "읽기 쉽고 조작하기 쉬운" 형태로 데이터를 다루게 해줍니다.

왜 이 기술이 중요한가요? 현대 자동화 작업에서 데이터는 거의 모든 곳에 존재합니다. 구문 분석 없이 스크립트는 단순한 반복 작업에 그치지만, 이를 통해 복잡한 워크플로우를 구현할 수 있습니다. 아래는 대표적인 시나리오입니다:

  • 구성 파일 읽기: INI나 JSON 같은 설정 파일을 파싱하여 소프트웨어의 동작을 동적으로 변경합니다. 예를 들어, 사용자 선호도를 반영한 UI 커스터마이징.
  • CSV(쉼표로 구분된 값) 파일 처리: 엑셀 같은 스프레드시트 데이터를 대량으로 불러와 필터링하거나 변환합니다. 마케팅 데이터 분석에 유용하죠.
  • 로그 또는 보고서에서 특정 값 추출: 서버 로그에서 오류 코드를 찾아 알림을 보내거나, 보고서에서 KPI(핵심 지표)를 자동 요약합니다.
  • 양식의 사용자 입력 처리: 웹 폼이나 CLI 입력을 검증하고, 유효한 데이터만 추출하여 데이터베이스에 저장합니다.

이러한 시나리오는 AutoHotkey의 자동화 잠재력을 극대화합니다. 구문 분석을 마스터하면 스크립트가 "지능적"으로 변신해, 단순 자동화에서 AI-like 작업으로 업그레이드됩니다.

AutoHotkey에서 구문 분석의 실제 예시

AutoHotkey는 StringSplit, Loop Parse, RegExMatch 같은 내장 함수로 구문 분석을 간단하게 만들어줍니다. 아래 예시들은 실무에서 바로 적용할 수 있도록 구성했습니다. 각 코드 뒤에 설명을 추가했으니, 따라 해보세요. (AutoHotkey v1.x 기준으로 작성되었으며, v2.x 사용자라면 약간의 문법 조정이 필요할 수 있습니다.)

1. CSV 파일 구문 분석

CSV는 가장 흔한 데이터 형식입니다. 이름과 이메일이 담긴 users.csv 파일을 가정해 보죠:

Name,Email
John Doe,johndoe@example.com
Jane Smith,janesmith@example.com

이 파일을 읽어 각 행을 분할하고, 결과를 메시지 박스로 출력하는 스크립트입니다:

FileRead, csvContent, users.csv  ; CSV 파일의 전체 내용을 읽어 csvContent 변수에 저장합니다.

Loop, Parse, csvContent, `n  ; 각 줄을 개행(`n)으로 파싱하여 반복합니다.
{
    if (A_Index = 1)  ; 첫 번째 줄(헤더)을 건너뜁니다.
        continue

    StringSplit, UserDataArray, A_LoopField, ,  ; 쉼표(,)를 구분자로 줄을 배열로 분할합니다. (세 번째 매개변수는 생략 가능)
    name := UserDataArray1  ; 배열의 첫 번째 요소: 이름
    email := UserDataArray2  ; 배열의 두 번째 요소: 이메일

    MsgBox, 4, 사용자 정보, 이름: %name%`n이메일: %email%  ; 결과를 대화상자로 표시합니다. (4는 Yes/No 버튼)
}

설명: FileRead로 파일을 로드한 후, Loop Parse로 줄 단위 처리. StringSplit이 쉼표로 쪼개 배열을 생성합니다. 이 코드를 확장하면 이메일 유효성 검사나 데이터베이스 삽입으로 이어질 수 있습니다. CSV에 따옴표나 이스케이프 문자가 많다면 RegExReplace로 미리 정제하세요.

2. 문자열에서 정보 추출

로그 파일처럼 비구조화된 텍스트에서 특정 키워드를 찾는 경우입니다. 타임스탬프와 메시지가 섞인 로그 예시:

[2023-10-01 12:00] 작업이 성공적으로 완료되었습니다.
[2023-10-01 12:05] 요청 처리 중 오류가 발생했습니다.
[2023-10-01 12:10] 정상 작동 중입니다.

오류 메시지만 필터링하는 스크립트:

logText := "[2023-10-01 12:00] 작업이 성공적으로 완료되었습니다.`n[2023-10-01 12:05] 요청 처리 중 오류가 발생했습니다.`n[2023-10-01 12:10] 정상 작동 중입니다."

Loop, Parse, logText, `n  ; 각 줄을 개행으로 파싱합니다.
{
    IfInString, A_LoopField, 오류  ; 줄에 "오류" 키워드가 포함되어 있는지 확인합니다.
    {
        MsgBox, 0, 오류 로그, 오류 발견: %A_LoopField%  ; 발견된 줄을 표시합니다. (0은 OK 버튼만)
        ; 여기에 추가 작업: 파일로 저장하거나 이메일 전송
    }
}

설명: IfInString으로 간단히 키워드 검색. 더 정교하게 하려면 RegExMatch를 사용해 패턴(예: [오류])을 매칭하세요. 이 스크립트는 모니터링 도구로 활용하면 시스템 관리에 딱입니다.

3. 복잡한 패턴에 정규 표현식 사용 (RegEx)

RegEx는 유연한 패턴 매칭의 왕입니다. 혼합된 날짜 형식을 추출하는 예시 텍스트:

이 이벤트는 10월 5일 정오에 발생하며, 다른 하나는 '11/22/23'로 예정되어 있습니다.

두 가지 형식(숫자 슬래시와 텍스트+서수)을 추출하는 코드:

sampleText := "이 이벤트는 10월 5일 정오에 발생하며, 다른 하나는 '11/22/23'로 예정되어 있습니다."

; 숫자 슬래시 형식 날짜 추출 (예: 11/22/23)
RegExMatch(sampleText, "(\b\d{1,2}[/-]\d{1,2}[/-]\d{2}\b)", dateFound)
MsgBox, 0, 숫자 형식 날짜, 정규식을 사용하여 찾은 날짜: %dateFound%

; 텍스트+서수 형식 날짜 추출 (예: October 5th - 한국어 버전으로 조정)
RegExMatch(sampleText, "(\b\w+\s\d{1,2}(?:st|nd|rd|th)?\b)", dateWords)  ; 한국어 텍스트에 맞게 조정 가능
MsgBox, 0, 텍스트 형식 날짜, 정규식 단어 형식으로 찾은 날짜: %dateWords%

설명: RegExMatch의 첫 번째 인수는 패턴, 두 번째는 매치된 전체 문자열, 세 번째는 캡처 그룹(괄호 안)을 저장합니다. \b는 단어 경계, \d{1,2}는 1-2자리 숫자입니다. RegEx는 초보자에게 어렵지만, RegEx101.com에서 테스트하며 익히면 금방 마스터할 수 있습니다. AutoHotkey의 RegExReplace로 텍스트 변환도 가능하죠.

구문 분석 기술 마스터를 위한 주요 팁

텍스트와 데이터를 효율적으로 다루려면 이론뿐 아니라 실전 팁이 필요합니다. 아래는 핵심 포인트입니다:

  • 구조 식별부터 시작하세요: 데이터가 구분자(쉼표, 탭) 기반인지, 고정 너비 필드인지 파악하세요. FileGetSize나 간단한 FileReadLine으로 미리 확인.
  • 내장 함수 활용 극대화: StringSplit으로 기본 분할, Loop Parse로 반복 처리, RegEx로 고급 패턴. 오류 방지를 위해 Try-Catch 블록( v2.x )을 추가하세요.
  • 성능 최적화: 대용량 파일은 FileReadLine로 줄 단위 읽기. 메모리 절약을 위해 불필요한 문자열 복사를 피하세요.
  • 디버깅 팁: OutputDebugToolTip으로 중간 결과를 확인. 복잡한 RegEx는 별도 변수에 저장해 테스트.

이 팁들을 적용하면 스크립트가 더 안정적이고 확장 가능해집니다.

728x90