全体表示

[ リスト ]

バッチファイル | テキストファイルを 1 行ずつ読み込む (完全版?)

初心者の自分が言うのもなんですが、「テキストファイルを 1 行ずつ読み込む」方法をググってみると、多くは不完全なものでした。そのため、なかなか思い通りの動作をせず、苦労しました。
忘れないうちにメモしておこうと思います。

正解 (?) だけ書いてもつまらないので、失敗例から書こうと思います。

以下、下のファイルがバッチファイルと同じディレクトリにあることを仮定します。
ファイル名: test.txt

test0
test1 test1

; test3
test4 & cls
test5 > con
test 6

1.スペースで文字列が切れる

さすがに、ここまでひどいサンプルは検索しても出てきませんでした。

失敗例
@echo off

for /f %%X in (test.txt) do (
echo %%X
)
実行結果
test0
test1
test4
test5
test
これを修正するには、 "delims=" で区切り文字列をなくすよう指定します。

2.";" (セミコロン) で始まる行がスキップされる

これに対処してるサンプル少なかった。
";" (セミコロン) 以下をコメント行として省略するという仕様。

失敗例
@echo off

for /f "delims=" %%X in (test.txt) do (
echo %%X
)
実行結果
test0
test1 test1
test4 & cls
test5 > con
test 6
これを修正するには、 "eol=" でコメント文字列をなくすよう指定します。

3.空行 (空白行) がスキップされる

これは なかなか見つけられなかった。あるサイトなんか「 for で空白行を処理するのは不可能」とまで書いてあった。
まあ確かに for だけでは無理ってのは間違ってないんだけど、コマンドを組み合わせれば望みどおりの処理が可能。

失敗例
@echo off

for /f "delims= eol=" %%X in (test.txt) do (
echo %%X
)
実行結果
test0
test1 test1
; test3
test4 & cls
test5 > con
test 6
これを修正するには、 findstr コマンド等で行番号を付加し、"tokens=1* delims=:" で行番号を分離します。
"tokens=1*" を指定することで、文字列中に ":" (コロン) が含まれていても正しく処理されます。

4.空白行を echo で表示できない

これは for の問題ではありませんが一応。
echo を引数なしで実行してしまうと、現在の設定を表示してしまう。

失敗例
@echo off

for /f "tokens=1* delims=: eol=" %%X in ('findstr /n "^" test.txt') do (
echo %%Y
)
( %%X は 行番号、 %%Y はその行の文字列)
実行結果
test0
test1 test1
ECHO は <OFF> です。
; test3
test4 & cls
test5 > con
test 6
これを修正するには、 echo の直後に "." (ピリオド) を打ちます。 (echo と "." (ピリオド) の間にスペースを入れてはならない)
空白行でない場合もちゃんと表示できるので、文字列が空かどうか調べて分岐する必要はない。

5.完成

これで完成です。
@echo off

for /f "tokens=1* delims=: eol=" %%X in ('findstr /n "^" test.txt') do (
echo.%%Y
)
実行結果
test0
test1 test1

; test3
test4 & cls
test5 > con
test 6

6.おまけ: echo は かっこ で囲うといいかもしれない

echo は最後のスペース等も出力してしまうので、かっこ で囲って出力する範囲をしっかりさせるといいかもしれない。これなら、標準出力を指定するときとかにスペースを入れられる。

(echo.文字列) >> 出力先

7.終わり

これで完璧なはず。
まだ不完全なところがあるようならコメントください。

では今回はこのへんで。
またいつか〜。


↓ブログランキング投票 (クリック) お願いします〜

この記事に

閉じる コメント(4)

顔アイコン

対象のファイル(test.txt)の中に「!」 エスクスクラメーション が存在していても 正しい動作になりますか? 教えて下さい。そのような内容が書かれたサイトを見たことが無いので。よろしくお願いします。 削除

2016/7/15(金) 午前 10:18 [ koi ] 返信する

顔アイコン

> koiさん
自分が確認した限りでは大丈夫そうです。

2016/7/17(日) 午後 6:13 Kerupani129 返信する

顔アイコン

test.txt 中、先頭に「:」(半角コロン)が入っている時、
これも表示したいのですが、表示されませんでした。

色々トライしているのですが、うまくいかず、
良いアイデアございますか。

恐れ入ります。 削除

2017/2/16(木) 午後 0:42 [ itc ] 返信する

顔アイコン

「!」はすべて取り除かれてしまいました。 削除

2017/3/2(木) 午後 4:42 [ hyesr ] 返信する

コメント投稿

顔アイコン

顔アイコン・表示画像の選択

名前パスワードブログ
絵文字
×
  • オリジナル
  • SoftBank1
  • SoftBank2
  • SoftBank3
  • SoftBank4
  • docomo1
  • docomo2
  • au1
  • au2
  • au3
  • au4
投稿

開く トラックバック(0)


.


みんなの更新記事