nkfを使ってファイルの文字コードを変換する
『ファイルの文字コードを変換する』ー この作業はいつの時代でも我々を悩ませる問題です。日本語を扱う場合であれば尚更。システムでデータをインポートする際に文字コードを指定する(環境側で指定されている)場合はこの問題に対して対処していく必要があります(例えば、Amazon Redshiftに於いては、その構造上utf-8を文字コードとして使用・統一せざるを得ない環境となっています)が、生成され、環境へ投入する事になる各種ファイルのエンコードが投入先の環境と異なる場合、都度変換処理を噛まさなければならなくなります。容量が軽く対処個数が少なければ手動でエディタでファイルを開き、所定のエンコードで保存し直す...という手法も考えられなくは無いですが、ファイル容量が大きい・数が膨大になる...というケースになった場合は早々に破綻する事は明らかです。
当エントリでは、その問題をより効果的・効率的な手法で解決する手法について備忘録代わりに内容をまとめてみたいと思います。
目次
- 文字コード変換にnkf(Network Kanji Filter)を使う
- 今回の検証で扱うファイルについて
- nkfのインストール&動作確認(Macの場合)
- nkfのインストール&動作確認(Amazon Linuxの場合)
- nkfのインストール&動作確認(Windowsの場合)
- 改行文字も併せて変換する
文字コード変換にnkf(Network Kanji Filter)を使う
- Network Kanji Filter - Wikipedia
- nkf(1): Network Kanji Filter - Linux man page
- Linuxコマンド逆引き大全 - 【 ファイルの文字コードを変換する 】:ITpro
扱うのはこちらの『nkf』(Network Kanji Filter)。1987年、30年近く前に開発されたものです。2014年現在でも有志の方々のメンテナンスにより、様々な環境で利用出来るようになっています。
今回の検証で扱うファイルについて
今回このエントリを書くに至ったのは『AWSでBI分析環境を構築するにあたり、投入先となるRedshiftに対応するエンコード(utf-8)で投入ファイルのエンコードも統一する必要がある』事からでした。投入したデータをTableau Desktopで閲覧・分析する事を想定していましたので、投入データもTableauが提供しているものを使おうと思います。最近Tableauのサイトでとある日本語のサンプルデータが公開されましたので、今回はこれを使って検証してみたいと思います。
まずは以下サイトにアクセスし、EXCELファイルをダウンロードしてください。
こちらがその内容です。
ダウンロードしたファイルを開き、[Orders]シートを選択した状態でその内容をCSVとして保存します。
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に変わってますね。
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に変換されていますね。
変換ルールについては以下のサイトが分かり易く記載されています。ご参考までに。
改行文字も併せて変換する
状況に拠っては改行文字(『^M』等)が含まれたままになってしまい、意図した通りの変換内容になってくれない場合もあるかと思います。その際はnkfコマンドで変換を行いたい形式のオプションを付与する事で改行文字もよしなに変換してくれます。
まとめ
以上、nkfを用いたファイルエンコードの変換処理について環境別にまとめてみました。この手の処理は多かれ少なかれ必要となる部分ですので、環境に応じて処理機構に組込む事で作業の効率化を図りたいところですね。