「バッチファイルでsplit()のように文字列分割したい……」
というときに使用するのが「for /F」。
今回はこの「for /F」について調べたので解説します。
for /Fによるトークン操作
「/Fオプション」でトークンというのを扱えるようになります。
ざっくりいうと、ある文字列に対して、区切り文字と何個目の要素を取得するか?を設定して、合致した条件のテキストを取得する感じです。
例えば
abc,def,ghi
という文字列があって
- 区切り文字:「,」
- 2番目を取得
とした場合、結果は
def
となります。
よくある言語で文字列操作プログラムを組んでれば、よくあるsplit()のような感じですね。
トークンと区切り文字の設定
まずここ。
"tokens=1* delims=.\"
項目 | 意味合い |
---|---|
token=N | N番目の要素を取得 |
delims=M | Mで文字列分割 |
ルールを文字列に適用
設定したトークンと区切り文字のルールを
in ("%var%")
の「%var%」の文字列に適用します。
適用した結果を得る
結果として取得した要素を「%%a」という変数にセットしてくれます。
注意点は、普通の変数と異なり%が先頭に2つです。
項目 | 変数 |
---|---|
通常時 | %a% |
for | %%a |
トークンを2つ以上指定した場合は、次~の文字の変数にセットされます。
例えば「token=1,2,3」とした場合、
- %%a
- %%b
- %%c
にセットされます。
コンソール実行時は変数名に注意
コマンドプロンプトなどで直接forコマンドを実行する場合は注意が必要です。
先頭の%が1つでないといけません。
つまりこういうこと。
for /f "tokens=1 delims=: " %a in ("abc def ghi") do ( echo %a )
コンソールとバッチファイルで、なんで記法を変えたんだか……
取得変数名は「1文字の英字」
取得する変数は、厳密には「%%a」でなくてもOKです。
サイトによっては「%%i」を使用したりしています。
実験してみたのですが1文字なら何でもいいみたいです。
for /f "tokens=1,3 delims=: " %%a in ("abc def ghi") do echo %%a %%b for /f "tokens=1,3 delims=: " %%i in ("abc def ghi") do echo %%i %%j for /f "tokens=1,3 delims=: " %%s in ("abc def ghi") do echo %%s %%t for /f "tokens=1 delims=: " %%aa in ("abc def ghi") do echo %%aa --- 結果 --- abc def ghi abc def ghi abc def ghi %aa の使い方が誤っています。
ファイルを1行ずつ処理する
in ()で指定する文字列を、ファイルパスにすると、ファイルのテキストを1行ずつ処理してくれます。
例えば下記のような「test.txt」を作ります。
123,456 abc,def ABC,DEF
in ()にtest.txtを指定して、「,」で区切った1要素目を表示させます。
for /f "tokens=1 delims=:," %%a in (test.txt) do ( echo %%a ) --- 結果 --- 123 abc ABC
これがあれば、規定フォーマットのファイルから効率よくテキストを抽出したりもできちゃいますね!
参考
コチラを参考にしました。ありがとうございました!
etc.miscmemo.com codeday.me qiita.com
あとがき
バッチファイルのsplit()「for /F」で文字列分割の使い方でした!
forは知ってはいたものの、コマンド内で結構とっつきづらい部類だったので、避けていましたが……
今回の文字列分割はかなり使えそうです。
恐らくPowerShellを使ったほうが、こういう処理は簡単なんでしょうが
- 実行までの微妙な待ち時間が嫌
- バッチファイルのようにファイル化して実行が面倒
というところでまだ避けているんですよね……
最近はこの辺もマシになったのかなぁ……
そうならPowerShellもいじっていきたいですね……
ともかく、バッチで文字列分割したい!というときは、よければ参考にしてください!