目次
その他の関連しそうな記事
ファイルから文字列を読み込む
ファイルから文字列を読み込むには、「for /f」コマンドを使用します。
「for」は繰り返し処理を行うコマンドですが、「for /f」はファイル内容を繰り返し読み込むというコマンドです。その他の「for」コマンドの使い方に関しては、「for(繰り返し処理) -コマンド別解説-」に詳しく解説しています。
では、以下のような「word.txt」ファイルがあったとします。
縦1列に名前が並んでいます。この中身を読むバッチファイル(read_word.bat)は以下のように書けます。
1 2 3 4 5 |
@echo off for /f %%a in (word.txt) do ( echo %%a ) |
3行目の「for」コマンドで「do ( )」の中をループさせています。その際、「in ( )」の括弧内に指定したファイルの中身を1行ずつ読み込み「%%a」に代入させてループを回します。
以下、実行結果です。
これがファイルの内容を読み取る基本の形です。
ちなみに、「%%a」の「a」はアルファベット1文字であれば、何でも構いません。私はよく「%%i」や「%%n」を使います。
この基本形から必要に応じて、オプションを追加するなどバッチプログラムを変更していきます。
単語区切りで読み込む
スペース区切り
前節ではファイル内の文字列を読み込む基本の形を示しました。では、以下のような1行に複数単語書かれているファイル(words.txt)場合はどうでしょうか。
1列目に名前、2列目に年齢が書かれています。
前節と同様のバッチファイルを実行してみます。
1 2 3 4 5 |
@echo off for /f %%a in (words.txt) do ( echo %%a ) |
以下、実行結果です。
はじめの1列(名前)だけしか表示されていません。
これは、「%%a」には1単語分しか入らないためです。そしてスペースまでが、1単語と認識されるため、「%%a」には初めの1列しか入りません。
2列目以降を取り出すには、「”token=[取り出したい列番号]”」オプションを使用します。
以下は、2列目までを取り出すように改良したバッチファイル(read_words.bat)です。
1 2 3 4 5 |
@echo off for /f "tokens=1,2" %%a in (words.txt) do ( echo %%a %%b ) |
このように、「/f」と「%%a」の間に「”tokens=1,2″」を書き込みます。「1と2列目を取り出します」という指示です。すると、「%%a」に一列目(名前)、「%%b」に2列目(年齢)が入るようになります。
ここでは、「%%a」を使っていますので、2列目以下には「%%b, %%c, …」が使われますが、これが「%%i」を使っている場合だと、2列目以下は「%%j, %%k, …」となります。すなわち、列が増えるに従って、その次のアルファベットが順に対応していくのです。
以下、実行結果です。
次は、3列のファイル(3words.txt)を読み込みます。
3列のときも2列の場合と同様です。
1 2 3 4 5 |
@echo off for /f "tokens=1,2,3" %%a in (3words.txt) do ( echo %%a %%b %%c ) |
単に、「tokens」に「3」を追加して、「%%c」に3列目の文字列を代入しています。
以下、実行結果です。
また、このプログラムは以下のようにも書くことができます。
1 2 3 4 5 |
@echo off for /f "tokens=1-3" %%a in (3words.txt) do ( echo %%a %%b %%c ) |
「tokens=1,2,3」を「tokens=1-3」としました。このように、取り出したい列が連番になっている場合は「[数字]-[数字]」として書くこともできます。
ただし、連番ではなく1列目と3列目を取り出したい場合は、以下のように「tokens=1,3」とします。
1 2 3 4 5 |
@echo off for /f "tokens=1,3" %%a in (3words.txt) do ( echo %%a %%b ) |
また、3列目の文字列は「%%c」ではなく「%%b」に入ることに注意して下さい。
その他の文字で区切られている場合
スペース以外で列を区切られている場合は、こちらでその区切り文字を教えてやる必要があります。
例えば、コンマ「,」で区切らている以下のファイル(3words_comma.txt)があるとします。
これを区切るためには、「delims=[区切り文字]」オプションで何の文字で列が区切られているかを指定します。
以下が、そのバッチファイル(read_words_comma.bat)です。
1 2 3 4 5 |
@echo off for /f "tokens=1-3 delims=," %%a in (3words_comma.txt) do ( echo %%a %%c ) |
「tokens」と並べて「delims=,」を指定しコンマ「,」が区切り文字であることを教えています。画面出力は、1列目と3列目としています。
以下、実行結果です。
当然、コンマ以外が区切り文字である場合の使い方も同様です。「delims=[区切り文字]」オプションで[区切り文字]の部分に区切り文字となる文字情報を与えます。
ここで、注意したいのがこの上記のバッチファイルでは「スペース」が区切り文字として扱われていないということです。
以下のバッチファイル(read_words_comma_3words.bat)で、前節で使用したスペース区切りのファイル(3words.txt)を読み込んでみます。
1 2 3 4 5 6 7 8 |
@echo off for /f "tokens=1-3 delims=," %%a in (3words.txt) do ( echo %%a echo %%b echo %%c echo; ) |
「delims」では「,」としているので、コンマは区切り文字として扱われています。
分かりやすいように、各文字列の出力は縦に並べました。
以下、実行結果です。
「%%a」に1行全てが代入されてしまい、「%%b」と「%%c」には何も代入されていません(「ECHOは<OFF>です。」という表示は右の引数を指定していないときに出ます)。すなわち、区切り文字が無く1行すべてが1単語と扱われたのです。
スペースもコンマ「,」もどちらも区切り文字にしたい場合、つまり、複数の区切り文字を指定する場合は、複数の区切り文字を並べて書けばオッケーです。
以下に、コンマ「,」とスペースの二つを区切り文字としたバッチファイル「read_words_space_comma.bat」を示します。
1 2 3 4 5 6 7 8 |
@echo off for /f "tokens=1-3 delims=, " %%a in (3words_space_comma.txt) do ( echo %%a echo %%b echo %%c echo; ) |
分かりずらいですが、コンマ「,」の後にスペースが追加されています。
両方の区切り文字が使われている「3words_space_comma.txt」ファイル(下図)を対象に実行しましょう。
以下、実行結果です。
欲しい結果を得ることができました。
1行すべてを読み込む
区切り文字など気にせずに、1行全て読み込みたい場合を考えます。
これは、前節の「delims」オプションの応用で簡単に実現可能です。
区切りたくないといういうことは、区切り文字がないということです。したがって、「delims=」に何も指定しなければよいということになります。
以下にそのバッチファイル(read_words_no_kugiri.bat)を示します。
1 2 3 4 5 6 |
@echo off for /f "delims=" %%a in (3words_space_comma.txt) do ( echo %%a echo; ) |
「delims=」だけを使用し、「=」の右には何も指定していません。
以下に実行結果を示します。
「%%a」に1行分が全て入っていることが分かります。
めちゃくちゃわかりやすいです。
助かりました