これは何?
ほとんどニーズはなさそうですが、CSVファイルが大きすぎてあるシステムの入力許容サイズを超えてしまうことがあり、分割するバッチを作成しましたので、同じニーズもあるかもしれないので、共有します。
linuxなどではもっと簡単にできると思いますが、windows環境だと、VBAに頼るしかなさそうで、それよりこっちの方が手っ取り早いと思います。
なお、windowsでは、バッチだけでファイルを分割するのは難しいため、Powershellを併用しています。
ただし、扱いやすくしたかったので、1つのバッチファイルにPowershellコマンドとして埋め込んでます。
無理やり埋め込んだために、Powershell部分が読みにくくなっていますが、ご容赦ください。
動作環境
Powershellさえ動けば使えますので、「CSVファイルを小さく分割したい」という奇特な方がいればご利用ください。
仕様
ファイル名は、分割元のファイルと同じディレクトリに、元のファイル名に「-1」など連番をつけて保存します。
もし、同じファイル名があれば上書きします。
なおCSVファイルなので、元ファイルの1行目にヘッダがあります。
分割しても各ファイルにヘッダをつけるようにしています。まー、これとバッチファイルだけで動くようにしたという2点だけが工夫点です。
また、デフォルトは10万行で分割していますが、自由に変更ください。(テストはしてませんが、パラメータでの指定も可能なはずです。)
注意
最後にお約束ですが、日本語環境のwindowsバッチなので、このバッチは必ずshift-JISで保存してください。
@echo off
chcp 932 >nul
set "source_file=%1"
set devide=%2
if "%devide%"=="" set devide=100000
set "pn=%~dpn1"
set "sf=%~1"
if "%pn%"=="" (
cls
echo.
echo 使い方「%0 ファイルパス [分割数]」
echo.
echo このバッチは、大きなCSVファイルを指定した行数に分割するためのバッチです。
echo.
echo 第2パラメータとして「分割数」を指定しなければ10万行に分割します。
echo なお、CSVの分割を想定しているため、1行目は全ファイルに付加します
goto :end
)
rem echo PN=%pn%
echo sf=%sf%を%devide%ごとに分割して、同じフォルダにファイル名を「-1」など連番を付けて保存します。
echo すでに同盟のファイルがあった場合は、上書きしますのでご注意ください。
echo.
powershell -NoProfile -Command "$i = 1; $chunkSize = %devide%; $filePath = '%SF%'; $header = Get-Content -Path $filePath -Encoding Oem -TotalCount 1; $lines = Get-Content -Path $filePath -Encoding Oem | Select-Object -Skip 1; for ($j = 0; $j -lt $lines.Count; $j += $chunkSize) { $outputPath = '%pn%-' + $i + '.txt'; Set-Content -Path $outputPath -Value $header -Encoding Oem; Add-Content -Path $outputPath -Value ($lines[$j..[Math]::Min($j + $chunkSize - 1, $lines.Count - 1)]) -Encoding Oem; $i++ }"
echo お待たせしました。分割完了しました。
:end
pause
exit