2017년 12월 8일 금요일

배치 파일 팁 - 라인스트링에서 단어단위로 작업하기

라인 스트링에서 개별단어를 뽑아내려면 어떻게 해야할까요?

가령 다음과 같은 스트링에서 
각 단어별로 처리를 하고 싶다면 어떻게 해야할까요
배치파일 내에서는 아래와 같은 방식으로 위의 스트링을 입력할 것입니다.

많은 사람들은 for 명령어에 여러가지 옵션을 붙여서 이 문제를 해결하려고 노력할 것입니다.
그러나 결론부터 말하면 for 명령어는 스트링을 개별적으로 처리하는 능력이 없다고 합니다.
그런 결론의 출처를 언급하고 싶지만 저도 귀찮이즘이라서... 양해를 부탁드립니다.

그러면 어떻게 하면 단어 단위로 작업을 할 수 있을까요?

웹서핑중에 아이디어를 얻었습니다.
그 아이디어는 "tokens=1*" 옵션으로 for 명령을 실행하여 첫번째 문장은 %%a에 저장하고 나머지는 %%b에 저장하는것입니다.
이렇게 한뒤 LINE_STRING을 %%b로 설정하고 필요한 만큼 반복실행하는것입니다.

"tokens=1*" 옵션으로 for를 실행했을때의 결과를 보면 다음과 같습니다.
아래의 배치파일을 실행하면
아래의 결과를 얻게됩니다.
 앞에서 설명한대로 LINE_STRING을 %%b로 대입하고 반복실행하면
아래와 같은 결과를 얻게됩니다.

이 방식을 발전시켜서 if 제어문을 사용하고 문자열 길이만큼 반복실행해서 단어를 분해해 내는것입니다.
아래처럼 배치파일을 작성하면
그 결과로 아래를 얻습니다.
예제를 포함한 전체 배치파일 소스는 아래와 같습니다.

@echo off

echo -- Example 1 -----------
set LINE_STRING=zero one two three four five six seven eight nine ten
for /f "tokens=1*" %%a in ("%LINE_STRING%") do (
echo. %%a
echo. %%b
)
echo ------------------------

echo -- Example 2 -----------
set LINE_STRING=zero one two three four five six seven eight nine ten
for /f "tokens=1*" %%a in ("%LINE_STRING%") do (
echo. %%a
echo. %%b
set "LINE_STRING=%%b"
)
echo.
for /f "tokens=1*" %%a in ("%LINE_STRING%") do (
echo. %%a
echo. %%b
set "LINE_STRING=%%b"
)
echo.
for /f "tokens=1*" %%a in ("%LINE_STRING%") do (
echo. %%a
echo. %%b
set "LINE_STRING=%%b"
)
echo.
for /f "tokens=1*" %%a in ("%LINE_STRING%") do (
echo. %%a
echo. %%b
set "LINE_STRING=%%b"
)
echo ------------------------


echo -- Example 3 -----------
set LINE_STRING=zero one two three four five six seven eight nine ten
:L1
if "%LINE_STRING%" neq "" (
for /f "tokens=1*" %%a in ("%LINE_STRING%") do (
echo.  word : [%%a]
set "LINE_STRING=%%b"
)
goto :L1
)
echo ------------------------