LoginSignup
41
39

More than 5 years have passed since last update.

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

Posted at

前提

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

バッチにしました

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

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

設定

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

参考ページ一覧

41
39
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
39