巨大なCSVファイルの文字コード変換にはnkfが便利

バッチ
スポンサーリンク

CSVファイルの文字コード変換を行う際、毎回必要時にテキストエディタでファイルを開いて、文字コードを変えて保存し直すという面倒な手段をとっていました。

今回、変換の自動化の必要に迫られ、php の file_get_contents 関数や fgetcsv 関数を用いて自作をする時間もないという状況の中、nkfという素敵なコマンドラインツールを見つけました。

この記事ではnkfの使い方や一般的なテキストエディタとの比較について解説します。

1.nkfとは?

「nkf」という一見よくわからない名前は、Network Kanji Filter(ネットワーク用漢字コード変換フィルタ)から命名されたようです。

まさかの日本語

マニュアルによると、そもそもは

ネットワークでメールやニュースの読み書きをするために作られた、漢字コードの変換フィルタである。

とのこと。もともとはUNIX向けに開発されたオープンソースソフトウェアを、日本人の有志によってWindows向けに移植されたものみたいです。

かなり以前からあるツールであることは間違いないようですね。

2.nkfのダウンロードとファイルの設置

  1. 以下からダウンロードします。
    nkf.exe nkf32.dll Windows用の詳細情報 : Vector ソフトを探す!
    ネットワーク用漢字コード変換フィルタ シフトJIS,EUC-JP,ISO-2022-JP,UTF-8,UTF-16
  2. nkf32.dllをwindows/system32フォルダへコピーします。
  3. nkf32.exeを「nkf.exe」などとリネームして、実行パスへ置きます。

3.nkfの基本的な使い方とサンプル

基本的な使い方

コマンドプロンプトにて以下の打ちます。

nkf [オプション] [ファイル名]( >[出力ファイル名] )

オプション値でよく使いそうなものには以下があります。

-s      : Shift-JISコードを出力
-e      : EUCコードを出力
-w      : UTF-8コードを出力(BOM無し)
--in-place : 上書き保存
--overwrite : 上書き保存

指定なし場合はShift-JISへ変換されます。

ちなみにBOMとは”Byte Order Mark”(バイト順マーク)のことで、ファイル先頭に付ける EF BB BF という3バイトのバイナリデータのことです。UTF-8であることを明示するために付けるもの。ソフトによってはBOM付きでないとUTF-8として認識しないものがあります。

サンプル

Shift-JISのCSVファイルをutf8へ変換するサンプル(元のファイルは残します)

nkf -w c:¥test¥sample.csv > c:¥test¥sample2.csv

Shift-JISのcsvファイルをutf8へ変換するサンプル(上書き保存します)

n/f -w --in-place c:¥test¥sample.csv

–in-place のところは –overwrite でもいけます。

4.nkfとサクラエディタの変換速度を比較

ちなみに変換に要する時間をテキストエディタと比較すると下記のようになります。

ここでは一般的なテキストエディタとして「サクラエディタ」を用います。

約200MBのCSVファイルを変換処理させた結果

ファイルオープン時間 変換&保存時間 合計
サクラエディタ(GUI操作) 30 sec 41 sec 71sec
nkf(コマンド操作) 47 sec 47 sec

上記のように、テキストエディタはファイルオープンにも時間がかかるため、要する全体時間は長くなります。(そもそも比較すべきではありませんが……)

また、上記のように200MB程度であれば要する時間に差が出るレベルで済みますが、1GBを超えるようなCSVファイルの場合、例えばサクラエディタだとファイルオープン時に”Abnormal Program Termination” のエラーが出て、そもそも変換ができないという問題もあります。

f:id:kojikoji75:20140113150359j:plain

これは「仮想メモリに使われる使用可能なハード ディスク領域が不足している」ことを意味するエラーです。

nkfだとどんなに巨大ファイルであってもこのようなエラーは出ることはなく、時間さえかければ変換可能なので、深夜バッチ処理等に使用するにはうってつけですね。

プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)

プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)

文字コード「超」研究 改訂第2版

文字コード「超」研究 改訂第2版

タイトルとURLをコピーしました