« コマンドプロンプトやバッチファイルで、環境変数に改行文字(LF)を入れて使う。 | トップページ | 改行文字変換フィルタをバッチファイルで作る。 »

2008年11月 3日 (月)

FORコマンドで、行のフィールドを順次取り出す。

例えば、CSVのような行で、各フィールドを決め打ちで取り出すには、

FOR /F "tokens=1-3 delims=," %%1 IN ("aaa,bbb,,ccc") DO (
ECHO;"%%1"
ECHO;"%%2"
ECHO;"%%3"
)

ですが、フィールド数が可変で、各フィールドを順次取り出すには?

再帰的に先頭フィールドを取り出します。

SETLOCAL ENABLEDELAYEDEXPANSION
SET LINE=aaa,bbb,,ccc
:LOOP
FOR /F "tokens=1* delims=," %%1 IN ("!LINE!") DO (
ECHO;"%%1"
SET LINE=%%2
GOTO :LOOP
)

フィールド区切りを改行文字に変えて、複数フィールドを複数行にします。

SETLOCAL ENABLEDELAYEDEXPANSION
SET LF=^(改行)
(改行)
(改行)
SET LINE=aaa,bbb,,ccc
SET LINE=%LINE:,=!LF!%
FOR /F "delims=" %%1 IN ("!LINE!") DO (
ECHO;"%%1"
)

いずれのやり方も、連続する区切り文字や先行する区切り文字が無視されます。

そこで、ダミーのヘッダ文字を付けると、空のフィールドが取り出せます。

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SET LF=^

SET LINE=aaa,bbb,,ccc
SET LINE=]%LINE:,=!LF!]%
FOR /F "delims=," %%1 IN ("!LINE!") DO (
SET LINE=%%1
ECHO;"!LINE:~1!"
)

« コマンドプロンプトやバッチファイルで、環境変数に改行文字(LF)を入れて使う。 | トップページ | 改行文字変換フィルタをバッチファイルで作る。 »