バッチファイルを使おう(初心者向け・forコマンド基礎編3)

過去2回、バッチファイルのForコマンドについて紹介させて頂きました。いずれも基本的なForコマンドの使い方でした。基礎はおおよそ理解出来た方は、もう少し踏み込みたいと考えていると思いますので、Forコマンドの基礎から、少しだけ踏み込んだ内容を紹介したいと思います。

ファイルの中身を調べることは必須

これが今回のテーマです。恐らくですが、折角ループ処理を使えるのであれば、ファイルやディレクトリだけではなく、ファイルの中身も扱いたいと言う方が多いかもしれません。業務上、ファイル内の走査は必然と言っても過言ではありません。プログラム言語を触ったことがある方は、必ずファイルの中身を解析するというロジックを組んだことがある人が大半だと思います。それくらい、ファイル内容の解析というものは避けられません。

もちろん、バッチファイルでも解析が可能です。Forコマンドの真骨頂とも言えるでしょう。それほど難しい事ではないので、リラックスしながら読んでみて下さい。

Forコマンドでファイル内容の解析

過去2回の記事と分けたのは、ファイル内容の解析についてはボリュームが大きいためです。一気に理解するのではなく、分かりやすいものから順番に理解して自分の武器にしていきましょう。

さて、ファイル内容の解析ですが、Forコマンドに用意されている「/f」オプションが実施してくれます。DOS先生に「help for」で尋ねてみると、「/f」オプションについては長い回答を頂きます。

FOR /F ["オプション"] %変数 IN (ファイル セット) DO コマンド[コマンド パラメーター]
FOR /F ["オプション"] %変数 IN ("文字列") DO コマンド [コマンド パラメーター]
FOR /F ["オプション"] %変数 IN ('コマンド') DO コマンド [コマンド パラメーター]
    または usebackq オプションの場合:
FOR /F ["オプション"] %変数 IN (ファイル セット) DO コマンド[コマンド パラメーター]
FOR /F ["オプション"] %変数 IN ('文字列') DO コマンド [コマンド パラメーター]
FOR /F ["オプション"] %変数 IN (`コマンド`) DO コマンド [コマンド パラメーター]

構文だけでも沢山あります。覚えるのは大変という第一印象ですが、それだけ汎用性が高いオプションとも言えます。「/f」オプションの基本形を整理するとこんな感じです。

FOR /F ["オプション"] %変数 IN (セット) DO コマンド[コマンド パラメーター]

ファイルセットやら文字列やらコマンドやらで「こんなにも使えるんだよ!」とDOS先生が仰ってますが、まとめると上記になります。まずは上記の基本形を覚えて下さい。

「/f」オプションの機能

「/f」オプションの機能を一言で表現するとファイル内容の解析です。解析する対象はセットに記載されたものが対象です。過去2回の記事にも記載していますが、セットに記載されている条件、例えば、拡張子「.csv」を指定すると、csvファイルをForコマンドの対象としてくれます。

「/f」オプション使用時の["オプション"]

オプションのオプションと書くと少し紛らわしいですが、ひとまず解析条件と考えて下さい。「help for」でDOS先生からお返事を頂いている通り、以下のオプションを使用することが出来ます。

eol=c
  - 行末のコメント文字を指定します (1 文字)。
skip=n
  - ファイルの先頭でスキップする行数を指定します。
delims=xxx
  - 区切り文字のセットを指定します。これは、既定の区切り文字であるスペースとタブを置き換えます。
tokens=x,y,m-n
  - 各繰り返しに対して、各行から for 本体に渡すトークンを指定します。
    これにより、追加の変数名が割り当てられます。
    m-n の形式は範囲で、m 番目から n 番目のトークンを指定します。
    tokens= 文字列の最後の文字がアスタリスクである場合は、追加の変数が割り当てられ、
    最後のトークンが解析された後、行に含まれている残りのテキストを受け取ります。
usebackq
  - 次の新しい表示形式を指定します。逆引用符で囲まれた文字列がコマンドとして実行され、
    一重引用符で囲まれた文字列がリテラル文字列コマンドになり、
    ファイル セットのファイル名を二重引用符で囲めるようになります。

いつものように例外なく、少し特徴的な回答なので、少しずつ解説します。

「eol=c」オプション

行末のコメントの開始文字を指定します。指定した文字以降はコメントになります。DOS先生の例文ではeol=cとしており、この場合は、「c」という文字以降はコメント扱いになります。使用出来るのは1文字だけです。

「skip=n」オプション

ファイルの先頭からスキップ(読み込まない)する行数を指定します。スキップと書いてあるので、そのままですね。skip=10と記載すれば、ファイル内の先頭から10行を読み込みの対象外とします。

「delims=xxx」オプション

区切り文字のセットを指定するものです。いわゆる、デリミタの指定です。区切り文字が分からないと言う方は少し調べて頂きたいです。区切り文字の意味を端的に説明すると、csvファイルを扱ったことのある人なら分かると思いますが、csvファイルのカンマが区切り文字です。

少し話が逸れましたが、区切り文字の指定することが出来るということです。尚、デフォルトでは区切り文字がタブとスペースが設定されています。csvファイル解析時に区切り文字がカンマであれば、「delims=,」とすれば大丈夫です。

「tokens=x,y,m-n」オプション

幾人ものエンジニアが直面するであろうトークンです。落ち着いて考えれば難しくはないのですが。繰り返し処理に対して、各行からforの本体に渡すトークンを指定・・・するのですが、字面だけでは分かりにくいと思います。例えば、次の様なcsvファイルがあるとします。

a,b,c,d,e

A,B,C,D,E

1,2,3,4,5

このcsvファイルの各行全てをコマンドプロンプト画面上に表示する場合は次のようにForコマンドを記載すれば可能です。

For /f "tokens=1,2,3,4,5 delims=," %%i in ( test.csv ) do echo %%i %%j %%k %%l %%m

「本体に渡す」というのは、ファイルから取得するという意味です。また、「tokens=x,y,m-n」という記載の「m-n」とあるように、「tokens=1-5」と記載しても同等の結果になります。注意して頂きたいのは、バッチ実行する場合は、Forコマンドに限らず、「%%a」というように、変数の前の「%」は二つ続けて下さい。

「usebackq」オプション

バッククォートで囲まれた文字列をコマンドとして実行します。例えば、セットの部分がファイル名ではなく、文字列を記述してそれを解析したい場合は、次の様に記述します。

For /f "usebackq tokens=1,2,3,4,5 delims=," %%i in ( `@echo A,B,C,D,E` ) do echo %%i %%j %%k %%l %%m

業務で使うのかピンとこないですが、今は知識として頭の片隅に置いて下さい。

まとめ

今回はForコマンドの「f/」オプションの基本的な使い方について紹介しました。何はともあれ、まずは基本です。自分でcsvを作成して読み込んでみて練習してみて下さい。