nkfを使ってファイルの文字コードを変換する

2014.05.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

『ファイルの文字コードを変換する』ー この作業はいつの時代でも我々を悩ませる問題です。日本語を扱う場合であれば尚更。システムでデータをインポートする際に文字コードを指定する(環境側で指定されている)場合はこの問題に対して対処していく必要があります(例えば、Amazon Redshiftに於いては、その構造上utf-8を文字コードとして使用・統一せざるを得ない環境となっています)が、生成され、環境へ投入する事になる各種ファイルのエンコードが投入先の環境と異なる場合、都度変換処理を噛まさなければならなくなります。容量が軽く対処個数が少なければ手動でエディタでファイルを開き、所定のエンコードで保存し直す...という手法も考えられなくは無いですが、ファイル容量が大きい・数が膨大になる...というケースになった場合は早々に破綻する事は明らかです。

当エントリでは、その問題をより効果的・効率的な手法で解決する手法について備忘録代わりに内容をまとめてみたいと思います。

目次

 

文字コード変換にnkf(Network Kanji Filter)を使う

扱うのはこちらの『nkf』(Network Kanji Filter)。1987年、30年近く前に開発されたものです。2014年現在でも有志の方々のメンテナンスにより、様々な環境で利用出来るようになっています。

 

今回の検証で扱うファイルについて

今回このエントリを書くに至ったのは『AWSでBI分析環境を構築するにあたり、投入先となるRedshiftに対応するエンコード(utf-8)で投入ファイルのエンコードも統一する必要がある』事からでした。投入したデータをTableau Desktopで閲覧・分析する事を想定していましたので、投入データもTableauが提供しているものを使おうと思います。最近Tableauのサイトでとある日本語のサンプルデータが公開されましたので、今回はこれを使って検証してみたいと思います。

まずは以下サイトにアクセスし、EXCELファイルをダウンロードしてください。

superstore-sample

こちらがその内容です。

superstore-sample-excel

ダウンロードしたファイルを開き、[Orders]シートを選択した状態でその内容をCSVとして保存します。

superstore-sample-export

 

nkfのインストール(Macの場合)

Macに於けるnkfのインストールはHomebrewで行ってみたいと思います。Homebrewの環境を整えた上で、以下コマンドを実施。

$ brew install nkf
==> Downloading http://dl.sourceforge.jp/nkf/53171/nkf-2.1.2.tar.gz
######################################################################## 100.0%
==> Patching
patching file Makefile
==> make
==> make install

導入後のバージョンも確認してみます。

$ nkf --version
Network Kanji Filter Version 2.1.2 (2011-09-08) 
Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa).
Copyright (C) 1996-2011, The nkf Project.
$

次いでファイルエンコードの確認。

$ nkf -g orders.csv
Shift_JIS

出力ファイルを別途指定し、nkfコマンドで実際に変換処理を掛けてみます。変換後のファイルのエンコードが指定した形(utf-8)となっている事が確認出来ました。

$ nkf -w orders.csv > orders-utf8.csv
$ nkf -g orders.csv 
Shift_JIS
$ nkf -g orders-utf8.csv 
UTF-8
$

エディタで変換後のファイルを開いてます。ちゃんとutf8に変わってますね。

superstore-sample-nkf

 

nkfのインストール(Amazon Linuxの場合)

Amazon Linuxでは上記エントリの通り、確かにyumコマンドだとインストールが出来ません。

$ sudo yum install -y nkf
読み込んだプラグイン:priorities, update-motd, upgrade-helper
amzn-main/latest                                                                                                         | 2.1 kB     00:00     
amzn-updates/latest                                                                                                      | 2.3 kB     00:00     
パッケージ nkf は利用できません。
エラー: 何もしません
$

rpmパッケージをダウンロードし、実行する事でインストールします。

$ sudo wget http://mirror.centos.org/centos/6/os/x86_64/Packages/nkf-2.0.8b-6.2.el6.x86_64.rpm
$ sudo rpm -ivh nkf-2.0.8b-6.2.el6.x86_64.rpm
警告: nkf-2.0.8b-6.2.el6.x86_64.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID c105b9de: NOKEY
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:nkf-1:2.0.8b-6.2.el6             ################################# [100%]
$
$ nkf --version
Network Kanji Filter Version 2.0.8 (2007-07-20) 
Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa),2000 S. Kono, COW
Copyright (C) 2002-2007 Kono, Furukawa, Naruse, mastodon
$

インストール後の操作はMacのものと同じなので割愛します。

 

nkfのインストール(Windowsの場合)

上記でインストールしたnkfはWindows版でも提供されているようですので、こちらでも導入してみます。Windows版の場合ですとアーカイブファイルを入手し、中に入っているexeファイルを配置するだけで扱えるようです。必要に応じて環境変数Pathにファイルパスを通すなどしておくと良いでしょう。

nkfwin/vc2005/win32(98,Me,NT,2000,XP,Vista,7)Windows-31J/ フォルダ配下のnkf32.exeを任意の場所に配置、上記Mac/Linuxで扱ったファイルを同じように操作してみます。(※コマンドプロンプトで実施。同じ内容の処理をPowerShell上でも試してみましたがutf-8への変換処理が上手く行きませんでした。何か環境上の違いでもあるのでしょうか。)

C:\tools>nkf32.exe -g orders.csv
Shift_JIS

C:\tools>nkf32.exe -w80 orders.csv > orders-utf8.csv

C:\tools>nkf32.exe -g orders-utf8.csv
UTF-8

C:\tools>

Windows上でエディタを使って開いてみます。こちらも想定通りutf-8に変換されていますね。

superstore-sample-nkf-win

変換ルールについては以下のサイトが分かり易く記載されています。ご参考までに。

 

改行文字も併せて変換する

状況に拠っては改行文字(『^M』等)が含まれたままになってしまい、意図した通りの変換内容になってくれない場合もあるかと思います。その際はnkfコマンドで変換を行いたい形式のオプションを付与する事で改行文字もよしなに変換してくれます。

まとめ

以上、nkfを用いたファイルエンコードの変換処理について環境別にまとめてみました。この手の処理は多かれ少なかれ必要となる部分ですので、環境に応じて処理機構に組込む事で作業の効率化を図りたいところですね。