テキストファイルを行数指定して分割出力するバッチを作りました

# 前提
とあるCSVファイルを処理するプログラムの制約により、データを100件ずつ分割しなければならなくなりました。
先頭3行はヘッダーとして認識されるため、分割ファイルそれぞれに同じヘッダーが必要です。

# バッチにしました
適当にコピーしてお使いください。一応設定方法を下に載せます。エラー処理は適宜追加してください。

```bat:split.bat
@echo off
setLocal EnableDelayedExpansion
goto :begin

Text File Splitter
------------------------------
USAGE: Check Settings section before running.

:begin

Rem ------------------------------
Rem Settings ...
Rem ------------------------------

Rem ------------------------------
Rem Original file information
Rem ------------------------------
set limit=100
set file="元のファイル.csv"
set numOfHeader=3
Rem Note: output will have (limit + numOfHeader) lines.

Rem ------------------------------
Rem Output file information
Rem ------------------------------
set name=出力ファイル名_
set extension=.csv
set zeroPadding=2



Rem ------------------------------
Rem Start process ...
Rem ------------------------------
set lineCounter=1
set filenameCounter=1
set header=
set NLM=^


rem Two empty lines are required here

if !numOfHeader! gtr 0 (
    set headerCounter=1
    for /f "tokens=* delims=: eol= usebackq" %%G in (%file%) do (
        if !numOfHeader! geq !headerCounter! (
            if !headerCounter! equ 1 (
                set header=%%G
            ) else (
                set header=!header!!NLM!%%G
            )
            
            set /a headerCounter=!headerCounter! + 1
        ) 
        if !headerCounter! gtr !numOfHeader! ( 
            goto :next
        )
    )
)

:next

for /f "tokens=* delims=: eol= usebackq" %%a in (%file%) do (
    set fileNum=00000000000!filenameCounter!
    set fileNum=!fileNum:~-%zeroPadding%!
    set splitFile=!name!!fileNum!!extension!

    if !lineCounter! equ 1 (
        echo Creating !splitFile! ...
    )

    if !numOfHeader! gtr 0 (
        if !filenameCounter! gtr 1 (
            if !lineCounter! equ 1 (
                echo:!header!>> !splitFile!
            )
        )
    )
    echo %%a>> !splitFile!

    set /a lineCounter=!lineCounter! + 1
    if !filenameCounter! equ 1 (
        set /a actualLimit=!limit! + !numOfHeader!
        if !lineCounter! gtr !actualLimit! (
            set /a filenameCounter=!filenameCounter! + 1
            set lineCounter=1
        )
    ) else (
        if !lineCounter! gtr !limit! (
            set /a filenameCounter=!filenameCounter! + 1
            set lineCounter=1
        )
    )
)

pause
```

## 設定
<dl>
<dt><code>set limit=100</code></dt>
<dd>何行ごとにファイルを分けるか指定します。</dd>
<dt><code>set file="元のファイル.csv"</code></dt>
<dd>分割を行うテキストファイル名を指定します。バッチファイルから参照できる位置にあることを確認してください。</dd>
<dt><code>set numOfHeader=3</code></dt>
<dd>先頭何行をヘッダーとして扱うか指定します。ヘッダーなしなら0です。実際の分割ファイルの行数は、<code>limit + numOfHeader</code> になります。</dd>
<dt><code>set name=出力ファイル名_</code></dt>
<dd>出力ファイル名のモトを指定します。この後ろに連番がつきます。</dd>
<dt><code>set extension=.csv</code></dt>
<dd>出力ファイルの拡張子を指定します。</dd>
<dt><code>set zeroPadding=2</code></dt>
<dd>出力ファイルにつける連番の桁を指定します。連番はゼロ埋めしますが、あまり賢くないので桁数がべらぼうに大きくなる場合はバッチを修正してください。</dd>
</dl>

# 参考ページ一覧
- [Batch file to split .csv file - Stack Overflow](http://stackoverflow.com/questions/20602869/batch-file-to-split-csv-file)
- [バッチファイル | テキストファイルを 1 行ずつ読み込む (完全版？) - Kerupani129 Project のブログ
](http://blogs.yahoo.co.jp/kerupani/15344574.html)
- [Explain how dos-batch newline variable hack works - Stack Overflow](http://stackoverflow.com/questions/6379619/explain-how-dos-batch-newline-variable-hack-works)