Windowsのバッチファイルでカンマ区切りのテキストファイル(CSVファイル)を扱いたい時のサンプルです。
サンプルコード
例えばCSVファイルがこんな感じになっていたとします。
1 2 3 4 |
社員番号,名前,メールアドレス 001,山田,yamada@example.com 002,佐藤,sato@example.com 003,田中,tanaka@example.com |
次の様なバッチファイルを作成し、引数に先ほどのCSVファイルを指定して実行します。
1 2 3 4 5 6 7 8 9 10 |
@echo off FOR /F "usebackq skip=1 tokens=1-3 delims=," %%I IN ("%~1") DO ( echo %%I echo %%J echo %%K echo, ) pause |
実行結果は次の様になります。
解説
それでは各行を解説していきます。
@echo off
コマンドを表示しない様にします。これが無いと以下の様に、実行コマンドが画面上に表示されてしまいます。(今回のテーマとあまり関係は無いですが)
FOR
繰返しの命令です。のちに続く文で繰り返し方を指定しています。
/F
指定したファイルの中身に対して繰り返し処理するという指定です。ここでは解説しませんが、他には指定したフォルダ配下のファイルに対して繰り返し処理するという指定などがあります。
“usebackq skip=1 tokens=1-3 delims=,”
usebackqはファイルパスの指定部分("%~1")にダブルクォーテーションを使えるようになります。次の様にusebackqを指定しない場合は、指定した文字列が処理対象として扱われます。
1 2 3 4 5 6 7 8 9 10 |
@echo off FOR /F "tokens=1-3 delims=," %%I IN ("a,b,c") DO ( echo %%I echo %%J echo %%K echo, ) pause |
上記の実行結果は次の様になります。
次の様に指定すればusebackqを使わないでもいいのですが、%1のパスに空白が含まれていると1つのファイルパスと認識してくれなくなるので、実運用上usebackqはほぼ必須のオプションです。
1 2 3 4 5 6 7 8 9 10 |
@echo off FOR /F " skip=1 tokens=1-3 delims=," %%I IN (%~1) DO ( echo %%I echo %%J echo %%K echo, ) pause |
skip=1は1行目まで飛ばすという指定です。skip=3とすれば3行目まで飛ばします。
tokens=1-3は1列目から3列目を処理対象とする指定です。tokens=1とすると%%Jと%%Kには何も入りません。
delims=,は区切り文字にはカンマを使うという指定です。デフォルトは空白とTabです。
%%I
取り出した値に名前を付けている部分です。%%Iじゃなくても%%Aでも%%Xでもいいです。バッチファイル内では%を2つ重ねる必要があります。DOSのコンソール上で直接実行する場合、%は重ねません。
IN (“%~1”) DO ()
%~1はバッチ起動時の1番目の引数で、それをダブルクォーテーションで括って指定しています。DO()の中にはは繰り返し処理したい内容を記述します。今回の例で言えばechoの部分。
まとめ
今回開設したFOR文はユーザーアカウントを一括作成する様な場面でよく使います。それ以外にも色々応用できると思いますので参考にしてみてください。