こんなことを知りたい人へ向けて書いています
- Winodwsバッチファイルでファイル内容を1行ずつ読み込みたい方
- 「for」コマンドを使ったファイル内容の読み込み方法をしりたい方
- スペースを含んだファイルから自在に内容を読み込みたい方
目次
その他の関連しそうな記事
ファイル内容を1行ずつ読み込む
ファイル内容を1行ずつ読み込むには「for」コマンドに「/f」オプションを付けたものを使用します。
1 2 3 |
for /f %%[アルファベット1文字] in ([読み込むファイル]) do ( [繰り返したい処理] ) |
[アルファベット1文字]には適当なアルファベットを入れてください。この「%%[アルファベット1文字]」にファイルの内容が入ることになります。[読み込むファイル]には読み込みたいファイル名を指定します。( )の中には繰り返したい処理を書きます。複数行にわたっても構いません。「for」コマンドについての詳細は「for(繰り返し処理) -コマンド別検索-」を参照してください。
例えば、「数独とは.txt」というファイルの内容が以下のような場合を考えます。
【数独とは.txt】
これを1行ずつ読み込んでコマンドプロンプト画面に出力するバッチファイル(read_each1line.bat)は以下のように書けます。
1 2 3 4 5 6 7 8 9 10 11 12 |
@echo off rem 「数独とは.txt」ファイルを1行ずつ読み込む for /f %%a in (数独とは.txt) do ( rem 出力 echo %%a rem 区切りを挿入 echo --- ) |
はじめの1行目はコマンドプロンプトへの出力を見やすくするためのものです。詳しくは「@echo offの意味 -コラム-」を参照してください。
4行目からが「for」ループの始まりです。[アルファベット1文字]には、ここでは「a」を使用しました。これは他の文字でも構いません。これより、「for」ループは「%%a」にファイルの内容が一行ずつ書き込まれながら、ファイルの最後まで回ることになります。[読み込むファイル]には「数独とは.txt」を指定しています。
7行目が「%%a」に入ったファイル内容を書き出す部分です。「echo」コマンドを使ってコマンドプロンプト出力にしています。
10行目は同じく「echo」コマンドでコマンドプロンプト画面に書き出しますが、「—」と出力します。これは、1回のループの区切りが分かるようにするためのものです。
では、このバッチファイルを実行しましょう。以下が実行結果です。
1回1回ループが回るたびに「—」が書き出されますので、この出力結果より1回のループで一行分が「%%a」に格納されていることが分かります。以下にもう一度「数独とは.txt」ファイルを示します。
スペースを含む場合のファイル内容を読み込み方
では、前節で作ったバッチファイル(read_each1line.bat)を使って、次は以下に示すようなファイルを読みこんでみましょう。
【クラシック.txt】
有名な音楽家の名前と曲名の一覧ファイルです。名前と曲名の間にスペースがあることに注意してください。「read_each1line.bat」の読み込むファイル名だけを変更して(「read_each1line_classic.bat」とします)実行した結果は以下の通りです。
今度は名前だけが出力され、曲名は表示されていません。この原因はスペースがある場合、その位置で一区切りと判断され「%%a」にははじめのスペースまでの文字列しか代入されないためです。
ここで、スペースを区切りとせず一行全体を読み込んで表示させたい場合には、「for」コマンドに「delims」オプションをつけます。「read_each1line_classic.bat」を以下のように変更します。
1 2 3 4 5 6 7 8 9 10 |
@echo off rem 「クラシック.txt」ファイルを1行ずつ読み込む for /f "delims=" %%a in (クラシック.txt) do ( rem 出力 echo %%a rem 区切りを挿入 echo --- ) |
4行目に「delims」オプションをつけて「”delims=”」としました。この「=」の右側には区切りとなる文字を指定します。「delims」オプションを指定しないデフォルトの状態では、スペースが区切り文字として登録されている状態です。したがって、「read_each1line_classic.bat」では一つ目のスペースまでが出力されました。
いまの場合は「”delims=”」と「=」の右側には何も指定していません。これは、区切り文字は無いことを示しています。したがって、「%%a」には一行全体が読み込まれます。以下は実行結果です。
今度は、曲名まで読み込まれているのが分かります。
任意の列の文字列を読み込み出力する
前節では、一行全体を読み込む方法を解説しましたが、次は任意の列をを読み込む方法を説明します。例えば、「クラシック.txt」ファイルの二列目の曲名だけを読み込むには「tokens」オプションを用います。
1 2 3 4 5 6 7 8 9 10 |
@echo off rem 「クラシック.txt」ファイルの2列目を読み込む for /f "tokens=2" %%a in (クラシック.txt) do ( rem 出力 echo %%a rem 区切りを挿入 echo --- ) |
4行目に「tokens=2」と付け加えました。こうすることで、2列目だけを「%%a」に読み込ませることができます。いま、前節で説明した「delims=」オプションは付けていませんので、スペースが区切り文字となっています。したがって、「クラシック.txt」の2列目というのは曲名となります。
以下、実行結果です。
思い通りに、曲名だけが出力されています。
区切り文字を指定する
任意の区切り文字をユーザーが指定することも可能です。それには、「delims」オプションを使います。前々節で行全体を一行全て読み込ませるためには、「”delims=”」を使いましたが、この「=」の右側に区切り文字にしたい文字を指定します。以下のような感じです。
1 2 3 |
for /f "delims=[区切り文字]" %%a in ([ファイル名]) do ( [処理内容] ) |
[区切り文字]には区切り文字にしたい任意の文字を指定します。
例えば、以下のようなファイルがあったとします。
【クラシック2.txt】
このファイルは「クラシック.txt」からスペースではなく、「|」で作曲家と曲名を区切っています。このファイルを「delims」オプションを指定していない以下のバッチファイル「read_each1line_nodelims.bat」
1 2 3 4 5 6 7 8 9 10 |
@echo off rem 「クラシック2.txt」ファイルを「delims」オプションを指定しないで読み込む for /f %%a in (クラシック.txt) do ( rem 出力 echo %%a rem 区切りを挿入 echo --- ) |
で読み込むと、実行結果は当然以下のようになります。
「|」は区切り文字として認識されていませんので、1行全体が%%aに代入され表示されています。
では、区切り文字に「|」を指定した。以下のバッチファイル「read_each1line_setdelims.bat」を実行してみましょう。
1 2 3 4 5 6 7 8 9 10 |
@echo off rem 区切り文字に「|」を指定 for /f "delims=|" %%a in (クラシック2.txt) do ( rem 出力 echo %%a rem 区切りを挿入 echo --- ) |
実行結果は以下の通りです。
今度は、「|」が区切り文字と認識されたため、一列目の作曲家だけが出力されました。この辺りのファイル読み込みに関する詳しい説明は「ファイルから文字列を読み込む -やりたいことかから検索-」にありますので、参考にしてください。
商魂たくましいのう