【MS-DOS】ファイル内の文字列を1行ずつ読み込んで、読み込んだ文字列から切り出す

geralt / Pixabay
見つからなかった・・・
いろいろ調べたけど、カンマ区切りやスペース区切りなどのデータを分割して抽出する情報はあったけど
区切りのない文字列から、特定部分を抽出するバッチがなかったので考えてみました。(見つけられなかっただけかも^^;)
ファイル内の文字列を1行ずつ読み込む
以下のようなデータファイルがあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
20151101 20151102 20151103 20151104 20151105 20151106 20151107 20151108 20151109 20151110 20151111 20151112 20151113 20151114 20151115 |
※データのファイル名は「data.txt」とします。
1行ずつ読み込んで「data_out.txt」に書き出すバッチを作ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@echo off setlocal rem ファイル内の文字列を1行ずつ読み込む for /f "delims=" %%a in (data.txt) do ( rem 読み込んだデータを1行ずつ書き込む echo %%a>> data_out.txt ) endlocal exit |
当たり前ですが、実行すると、1行ずつ読み込んで、1行ずつ書き出すので「data.txt」と同じになります。
文字列から必要な部分を切り出す
今回は、「201511xx」の「11xx」の部分が必要なので、「%str:~4,4%」と記述します。
1 2 3 4 5 6 7 8 |
%[変数]:~[開始位置],[文字数]% 開始位置が「0」なので5文字目から4個切り出す場合は、以下の様に記述します。 %str:~4,4% |
1行ずつ読み込んで、読み込んだ文字列から必要部分を切り出す
上記の2つを合わせて完成です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@echo off setlocal rem ファイル内の文字列を1行ずつ読み込む for /f "delims=" %%a in (data.txt) do ( call :sub "%%a" >> data_out.txt ) exit :sub rem 5文字目から4個切り出す set str=%~1 echo %str:~4,4% exit /b |
少し説明。
切り出しの部分をサブルーチンにしてます。
forコマンドで1行ずつ読み込んだデータをサブルーチンに渡して(call :sub “%%a”)処理(切り出し)させて、
結果を戻して「data_out.txt」に書き出してます。
まとめ
forコマンドって奥が深いね。
サブルーチンを変えれば、「1行ずつ読み込んで○○○○させて、書き出す」って応用がきくと思います。