Windowsのコマンドプロンプトでファイルを1行ずつ読み込む

##やりたいこと

- ファイルに記載された指定の名前でディレクトリを作成する
- 作成したディレクトリ配下に指定のサイズのダミーファイルを作成する

###要するに
```text:makeFile.txt
20190101 01
20190101 02
20190102 01
20190115 01
```
このようにスペース区切りで書かれたファイルがあるとすると、下記のようにC:¥workの配下にディレクトリを作成し、

```
C:¥work¥
     |-20190101
     |     |-01
     |     |-02
     |-20190102
     |     |-01
     |-20190115
           |-01
```
さらに最深ディレクトリにdummy1.txt〜dummy5.txtを作成＆配置。

```
C:¥work¥
     |-20190101
     |     |-01
     |     |  |-dummy1.txt
     |     |  |-dummy2.txt
     |     |  |-dummy3.txt
     |     |  |-dummy4.txt
     |     |  |-dummy5.txt
     |     |-02
     |     |  |-dummy1.txt
     |     |  ~略~
     |     |  |-dummy5.txt
     |-20190102
     |     |-01
       ~略~
```

手作業だと~~めんどくせぇ~~手間がかかるので、バッチで一気に作ってもらおう！と。＾＾


##1.　ファイルを1行ずつ読み込む
`for /f %%[アルファベット1文字] in ([ファイル名]) do ([処理])`

まず初めにファイルを１行ずつ読み込み、スペースを区切りとしてそれぞれの値を取得して変数に格納します。

```
@echo off

rem makeFile.txtからスペースまで(1列目)をaに格納,2列目をbに格納
for /f "tokens=1,2" %%a in (makeFile.txt) do (
  echo %%a
  echo %%b
  echo ----------
)
```
**実行結果**

```
20190101
01
----------
20190101
02
----------
20190102
01
----------
20190115
01
----------
```
"tokens=n"でn列目の値を取得してくれます。今回は1列目と2列目を取得したいので"tokens=1,2"と書きます。変数には%%aだけ書けば、自動的にbに二つ目の値が取得されます。そのためxyz等の変数を指定するのはやめておいたほうがいいでしょう。

**スペースが区切りとなる**
もしスペースを区切りとせずに１行全体を取得したい場合は「delims」オプションをつけます。

```
@echo off

rem makeFile.txtから1行全体を取得
for /f "delims=" %%a in (makeFile.txt) do (
  echo %%a
  echo ----------
)
```
**実行結果**

```
20190101 01
----------
20190101 02
----------
20190102 01
----------
20190115 01
----------
```

もし区切り文字がスペースでなく「/」だったら"delims=/"と書きます。

>[forループを使ってファイル内容を一行ずつ読み込む](https://jj-blues.com/cms/wantto-readfilelinewithfor/)

##2.　ディレクトリ作成
`mkdir <ディレクトリ名>`
で作成できます。
上記のforループとmkdirコマンドで指定のディレクトリを作成することができます。

```mkdir.bat
@echo off
cd /d %~dp0

setlocal enabledelayedexpansion
rem makeFile.txtからスペースまで(1列目)をaに格納,2列目をbに格納
for /f "tokens=1,2" %%a in (makeFile.txt) do (
    set dir1=%%a
    set dir2=%%a\%%b
  
    rem ディレクトリがなければ作成
    if not exist !dir1! (
        echo !dir1!のディレクトリを作成します
        mkdir !dir1!
        if not exist !dir2! (
            echo !dir2!のディレクトリを作成します
            mkdir !dir2!
        )
    ) else (
        if not exist !dir2! (
            echo !dir2!のディレクトリを作成します
            mkdir !dir2!
        )
    )
)
endlocal
```

**注意**
「setlocal enabledelayedexpansion」はforループの中で値を変化させるためのおまじないです。
`setlocal enabledelayedexpansion ～ endlocal`でforループを囲ってあげましょう。
また、ループ内で変数を使用する場合は、%ではなく!で囲む必要があります。
>[バッチファイルでループ処理する](https://jj-blues.com/cms/wantto-useloop/)

##3. 指定したサイズのダミーファイルの作成

ファイルの作成は
`fsutil file createnew <ファイル名> <サイズ(byte)>`
でできます。
>[指定サイズダミーファイル生成(Windows, Mac)](https://webbibouroku.com/Blog/Article/create-dummyfile)

これをforで5回まわしてあげます。
`for /L %%[アルファベット1文字] in (開始,ステップ,終了) do ([処理])`
>[意外と知られていないけど、知っていると便利な FOR コマンド](https://www.keicode.com/windows/for-command.php)

```mkdir.bat
@echo off
cd /d %~dp0

setlocal enabledelayedexpansion
rem makeFile.txtからスペースまで(1列目)をaに格納,2列目をbに格納
for /f "tokens=1,2" %%a in (makeFile.txt) do (
    set dir1=%%a
    set dir2=%%a\%%b
  
    rem ディレクトリがなければ作成
    if not exist !dir1! (
        echo !dir1!のディレクトリを作成します
        mkdir !dir1!
        if not exist !dir2! (
            echo !dir2!のディレクトリを作成します
            mkdir !dir2!
        )
    ) else (
        if not exist !dir2! (
            echo !dir2!のディレクトリを作成します
            mkdir !dir2!
        )
    )

    set count=0
    for /L %%n in (0,1,5) do (
        set /a count=!count!+1
        fsutil file createnew !dir2!\dummy!count!.txt 1024
    )
)
endlocal
```

これで完成です。
今回は1KBのダミーファイルを作成しました。

##4. 実行してみる

![2019-01-19 (3).png](https://qiita-image-store.s3.amazonaws.com/0/208609/06b36573-a7d1-81c2-05b4-f40a9626d402.png)

**おお！**

![2019-01-19 (4)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/208609/7bf3d38b-8b33-1219-a35f-c5832caa5da2.jpeg)



**おお！**

![2019-01-19 (5)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/208609/e1f714cd-627e-fed9-2476-31c6677a2ff6.jpeg)


**おお！**

できました。ちゃんと1KBになってますね:clap:
以上です。ありがとうございます。