TechNote

事務屋のおぼえがき

渋すぎるツール! 巨大なCSVファイルの文字コード変換にnkfが便利

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

今回、変換の自動化の必要に迫られ、phpのfile_get_contents関数やfgetcsv関数を用いて自作をする時間もないという状況の中、nkfという便利なコマンドラインツールに出会ったのでメモを残す。

f:id:kojikoji75:20140113161758j:plain
photo credit: Andrew* via photopin cc

サマリー

1.nkfとは?
2.nkfのダウンロードとファイルの設置
3.nkfの使い方とサンプル
4.nkfの使用感想





1.nkfとは?

nkf」というよくわからない名前は「ネットワーク用漢字コード変換フィルタ」から命名されたようである。

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

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

とのこと。


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

(1)以下からダウンロードする。
http://www.vector.co.jp/soft/win95/util/se295331.html


(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(または--overwrite) c:¥test¥sample.csv


4.nkfの使用感想

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

約200MBのcsvファイル

ファイルオープン時間 変換&保存時間 合計
sakuraエディタ(手動) 30 sec 41 sec 71sec
nkf 47 sec 47 sec

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

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

f:id:kojikoji75:20140113150359j:plain

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

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


あわせて読みたい

システム管理者でなくても知っとくべき! Windowsサーバ/クライアントの時刻同期設定まとめ - TechNoteシステム管理者でなくても知っとくべき! Windowsサーバ/クライアントの時刻同期設定まとめ - TechNote

コンピュータの内臓時計はズレやすいため、「時刻同期」について検討することはとても重要なことと思われますが、その重要性はあまり認識されていない気がします。私も先日...

Windows セキュリティゾーン関連レジストリをバッチで編集する方法 - TechNoteWindows セキュリティゾーン関連レジストリをバッチで編集する方法 - TechNote

端末名取得等の目的でWebアプリからVBScriptを実行するには各クライアントに対して以下の設定を行う必要がある。①信頼済みサイト追加②「信頼済みサイト」⇒「...

JavaScriptでWindow.closeする時のブラウザ別対応まとめ - TechNoteJavaScriptでWindow.closeする時のブラウザ別対応まとめ - TechNote

社内用のWebシステムにこれまで設置してなかった「閉じる」ボタンを設置することになった際、少々ブラウザ問題でつまずいた点があった。ググっても最近のwindow....


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

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

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

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