❏はじめに
ファイル分割をしたいという需要が最近芽生えたので、どうにかWindows環境でできないものか調査
やりたいことが実現できたのでめもめも
❏要求
- 大容量ファイルを開きたい
- 大容量ファイルを比較、差分がみたい
- Windows環境のみで実現したい
❏実装
[split.bat]
@echo off
setlocal ENABLEDELAYEDEXPANSION
rem #======================================#
rem # 使い方
rem #======================================#
rem ■以下の変数に任意のあたいを設定すること
rem max 最大分割行数
rem inputFile 分割対象ファイル(バッチファイルと同じディレクトリに存在するファイル名
rem フルパスでもOKだが()やスペースがあると動作しない可能性あり
rem #======================================#
rem # 変数領域
rem #======================================#
set /a num=0
set /a fileNm=0
set /a max=1000
set /a fileCount=0
set inputFile=D:\work\bat\head\test.txt
type %inputFile% | find /v /c "" > line.log
for /f "usebackq tokens=*" %%i IN (`type line.log`) DO @set line=%%i
set /a fileCount=%line% / %max% + 1
echo ■■■■■■■■■■■■■■■■■■■■
echo ■
echo ■ ファイル分割処理
echo ■
echo ■■■■■■■■■■■■■■■■■■■■
echo 処理対象ファイル名:%inputFile%
echo 分割行数 :%max% 行
echo ファイル行数 :%line% 行
echo 出力ファイル数 :%fileCount%
for /f "usebackq eol= delims= skip=1 delims=" %%s in (%inputFile%) do @(
set /a num=num+1
echo %%s >> split_!fileNm!.txt
rem echo !num!
rem echo !max!
if !num! equ !max! (
echo split_!fileNm!.txt 書き込み完了
set /a fileNm=fileNm+1
set /a num=0
)
)
:break
:end
echo .
echo 処理が完了しました!
echo .
pause
❏使い方
■以下の値を指定
- max 最大分割行数
- inputFile 分割対象ファイル(バッチファイルと同じディレクトリに存在するファイル名
フルパスでもOKだが()やスペースがあると動作しない可能性あり
❏出力
■■■■■■■■■■■■■■■■■■■■
■
■ ファイル分割処理
■
■■■■■■■■■■■■■■■■■■■■
処理対象ファイル名:test.txt
分割行数 :1000 行
ファイル行数 :62080 行
出力ファイル数 :63
split_0.txt 書き込み完了
split_1.txt 書き込み完了
split_2.txt 書き込み完了
split_3.txt 書き込み完了
split_4.txt 書き込み完了
split_5.txt 書き込み完了
split_6.txt 書き込み完了
split_7.txt 書き込み完了
split_8.txt 書き込み完了
split_9.txt 書き込み完了
...
.
処理が完了しました!
.
続行するには何かキーを押してください . . .
❏追記
以下のブログで紹介されている方法でもっと簡単に、一瞬でファイル分割処理ができました。。
- PowerShell立ち上げる
- 分割対象ファイルがあるフォルダに移動する
-
$i=0; cat .\test.txt -ReadCount 3 | % { $_ > test$i.txt;$i++ }
を実行
→ファイル分割完了!
調整するのはファイル名「.\test.txt」と ReadCountにしている分割行数のみ
※注意※ UNICODE文字 BOM付で出力される
今回はバッチファイルの勉強になったと思って、。
PowerShellもある程度かけるようになりたいと思いました。
でもやっぱり、linuxやunix環境があるなら、splitが楽ちんだと思います。笑