Loop (문자열을 해석함)

문자열로부터 부문자열(필드)를 한 번에 하나씩 열람합니다.

Loop, Parse, InputVar [, Delimiters, OmitChars]
선택

매개변수

Parse

이 개변수는 단어 PARSE만 됩니다. 다른 회돌이 유형과 다르게, 변수 참조는 단어 PARSE로 결정된다고 할지라도 허용하지 않습니다.

InputVar

내용을 분석할 변수의 이름. 이름을 퍼센트 사인으로 둘러 싸지 마십시오. 변수의 내용을 이름으로 사용하고 싶다면 예외입니다.

[v1.1.21+]: 이 매개변수는 % 표현식이 될 수 있지만, 퍼센트-스페이스 접두사가 반드시 사용되어야 합니다.

Delimiters

이 매개변수가 비어 있거나 생략되면, InputVar의 각 문자는 별도의 부문자열로 간주됩니다.

이 매개변수가 CSV이면, InputVar는 표준의 쉼표로 가른 값 형식으로 해석됩니다. 다음은 CSV줄의 예로서 MS Excel로 생산했습니다:

"first field",SecondField,"the word ""special"" is quoted literally",,"last field, has literal comma"

그렇지 않으면, Delimiters에는 하나 이상의 문자가 담깁니다 (대소문자 구별), 각 문자마다 InputVar에서 부문자열이 일어나는 경계를 결정합니다.

Delimiter 문자들은 부문자열 자체의 일부로 간주되지 않습니다. 또, InputVar 안에서 한 쌍의 구분자 사이에 아무것도 없다면, 상응하는 문자열은 비어 있습니다.

예를 들어: `, (피신된 쉼표)는 문자열을 쉼표가 출현할 때마다 가릅니다. 비슷하게, %A_Tab%%A_Space%InputVar에서 스페이스나 탭을 만날 때마다 새 문자열을 시작시킵니다.

문자 하나가 아니라 문자열을 구분자로 사용하려면, 먼저 StringReplace를 사용해 해당 문자열이 나타나면 모두 텍스트에서 절대로 문자 그대로 사용되지 않는 문자 하나로 교체합니다. 예를 들어 다음의 특수 문자들 중 하나: ¢¤¥¦§©ª«®µ¶. 다음 예제를 연구해 보십시오. 문자열 <br>을 구분자로 사용합니다:

StringReplace, NewHTML, HTMLString, <br>, ¢, All
Loop, parse, NewHTML, ¢ ; 센트 심볼에 기반하여 문자열을 해석합니다.
{
...
}
OmitChars

각 부문자열의 선두와 후미에서 배제할 문자의 (선택적) 리스트 (대소문자 구분). 예를 들어, OmitChars가 %A_Space%%A_Tab%이면, 스페이스와 탭이 열람된 매 부문자열로부터 선두와 후미에서 제거됩니다 (가운데는 아님).

Delimiters가 비어 있으면, OmitChars는 고려 대상에서 배제할 문자들을 가리킵니다 (회돌이는 그런 문자들을 보지 못합니다).

대부분의 다른 명령어의 마지막 매개변수와 다르게, OmitChars에서 쉼표는 반드시 피신시켜야 합니다 (`,).

논평

문자열 파싱 회돌이는 문자열에 들어 있는 각 필드를 한 번에 하나씩 처리할 때 유용합니다. (StringSplit은 영구적인 의사-배열을 생성하기 때문에) 파싱 회돌이는 StringSplit 보다 메모리를 덜 사용하고 대부분의 경우 더 사용하기 쉽습니다.

내장 변수 A_LoopField는 모든 파싱 회돌이 안에 존재합니다. 안에 InputVar로부터 파싱한 현재의 부문자열(필드)가 들어 있습니다. 내부 파싱 회돌이가 바깥 파싱 회돌이로 둘러 싸여 있다면 내부 회돌이의 필드가 우선 순위가 높습니다.

내장 변수 "A_LoopDelimiter"는 전혀 없지만, 이 페이지 맨 아래 예제는 각 필드마다 어느 구분자를 사용하고 있는 보여줍니다.

InputVar의 크기 또는 그의 필드의 크기에는 제한이 없습니다. 게다가, InputVar의 내용이 회돌이를 실행하는 동안에 바뀐다면, 그 회돌이는 그 변화를 "보지 못합니다". 왜냐하면 원래 내용의 임시 사본을 처리하고 있기 때문입니다.

해석하기 전에 필드를 다른 순서로 정돈하려면, Sort 명령어를 사용하십시오.

Blocks, Break, Continue, 그리고 A_Index 변수 (모든 회돌이에 존재)에 관한 정보는 Loop를 참조하십시오.

관련 항목

StringSplit, file-reading loop, Loop, Break, Continue, Blocks, Sort, FileSetAttrib, FileSetTime

예제

; 예제 #1:
Colors = red,green,blue
Loop, parse, Colors, `,
{
    MsgBox, Color number %A_Index% is %A_LoopField%.
}
선택 | 내려받기

 

; 예제 #2: 변수 안에 줄들을 하나씩 읽어 들입니다 (파일-읽기 회돌이와 유사).
; FileRead를 통하여 파일을 변수 안에 적재할 수 있습니다:
Loop, parse, FileContents, `n, `r  ; `n을 먼저 `r을 다음에 지정해야 Windows와 Unix 파일을 모두 해석할 수 있습니다.
{
    MsgBox, 4, , Line number %A_Index% is %A_LoopField%.`n`nContinue?
    IfMsgBox, No, break
}
선택 | 내려받기

 

; 예제 #3: 위의 예제와 같지만 클립보드용입니다.
; 클립보드에 파일이 담겨 있을 때 유용합니다. 그런 파일은 보통 탐색창으로부터 복사됩니다 
; (프로그램은 자동으로 그런 파일을 그들의 파일 이름으로 변환합니다):
Loop, parse, clipboard, `n, `r
{
    MsgBox, 4, , File number %A_Index% is %A_LoopField%.`n`nContinue?
    IfMsgBox, No, break
}
선택 | 내려받기

 

; Example #4: 쉼표로 가른 값 (CSV) 파일을 해석합니다:
Loop, read, C:\Database Export.csv
{
    LineNumber = %A_Index%
    Loop, parse, A_LoopReadLine, CSV
    {
        MsgBox, 4, , Field %LineNumber%-%A_Index% is:`n%A_LoopField%`n`nContinue?
        IfMsgBox, No
            return
    }
}
선택 | 내려받기

 

; 예제 #5: 어느 구분자에 마주했는지 알아내기.

; 검색할 문자열을 초기화 합니다.
Colors = red,green|blue;yellow|cyan,magenta
; 문자열에서 위치를 추적할 계수를 초기화합니다.
Position := 0

Loop, Parse, Colors, `,|;
{
    ; 이 필드의 끝에서 구분자의 위치를 계산합니다.
    Position += StrLen(A_LoopField) + 1
    ; 해석 회돌이가 발견한 구분자를 열람합니다.
    Delimiter := SubStr(Colors, Position, 1)

    MsgBox Field: %A_LoopField%`nDelimiter: %Delimiter%
}
선택 | 내려받기