TMD45'β'LOG!!!

Life is Beta-ful.

Windows 標準コマンドを使ってファイルサイズを指定してテキストファイルを分割する(不完全版)

※この記事は Qiita に投稿したものと同じです。

肥大化したログファイルを Windows 上のテキストエディタで開きたいと思っても、数百メガあるとなかなか開けなかったり、テキスト検索に時間がかかったりと困りものです。

Linuxsplit コマンドのように好きなサイズや行数でファイルを分割するようなものは Windows には存在しないようで、いろいろ調べたのですが、どの方法も「バッチファイルを作れ」とか「VBScript を書け」とか面倒。ひたすら別の方法がないか探していたら、どうやら MakeCab コマンドを使ってファイル分割ができるようです。

※ただしこの方法は不完全で、分割したファイルの先頭に文字化けした Unicode 文字列が入ったり、なにかの拍子にファイルの途中に Unicode 文字が出現したりします(原因解析してない)。個人的にログ解析に支障は無い程度だったので放置していますが、ご了承のうえご利用ください

MakeCab コマンド

Windows XP や Windows 7 では標準コマンドとして用意されているようです(確認した環境は Windows XP Professional SP3 です)。
現在は Windows SDK に含まれている?(未確認)

キャビネット形式(*.cab)の圧縮ファイルを作るためのコマンドですが、オプションを指定してやることでファイルをサイズ指定して分割することが出来ます。
今回は指定するコマンドが少々多いので、 *.ddf ファイルに書き出してコマンド実行時に指定する方法で実行します。

オプション指定ファイルを用意

分割対象のファイルや、分割後のファイルサイズの指定を *.ddf ファイルに記述します。
*.ddf のファイル名は何でも構いません、たとえば split_textfile.ddf とか。
分割対象のファイルは複数指定することが出来ます。

.Set CabinetNameTemplate=splited.file.name.* ;分割後のファイル名(* に 1,2,... の連番が入ります。)
.Set DiskDirectoryTemplate=                  ;この指定が無いと Disk1,Disk2,... というフォルダが作成されます
.Set MaxDiskSize=1024000                     ;分割後のファイルサイズ(byte。512の倍数で指定)
.Set Cabinet=on                              ;必ず on にします。off にすると分割されません
.Set Compress=off                            ;圧縮はしないので off に。
"C:\\path\to\textfile.txt"
"C:\\path\to\textfile2.txt"

この *.ddf ファイルを分割したいファイルと同じ場所に置きます。*1
(あるいは別の場所に置いて実行することも可能です。今回は説明のために同じ場所に置くことにしました)

ファイル分割の実行

コマンドプロンプトで、分割したいファイルと *.ddf ファイルを置いたフォルダへ移動して以下のコマンドを実行します。

>MakeCab /F split_textfile.ddf

分割中は処理状況(パーセント)が表示され、数分で splited.file.name.1,splited.file.name.2,... という名前の分割ファイルが作成されます。

最後に setup.infsetup.rpt というファイルが出来ますが、今回の目的では使用しませんので削除してしまって構いません。
setup.inf は CAB 形式のインストールファイルとしてインストール内容が記述されるファイルです。setup.rptMakeCab の実行結果のリポートファイルです。
オプションに以下を追加して *.inf ファイルが出来ないようにしておくとちょっと安心かもしれません。

.Set InfFileName=hoge  ;拡張子つけない

以上で

望んだサイズに分割されたファイルが出来ました!
先に書いたとおり Unicode による文字化けが発生する場合もありますが、ほとんどの内容は無事に出力されていると思います。

*1:おおぅこれはひどい改行・・・

▲ ページトップへ移動