ファイルの文字コード&改行コードを確認・変換するためのツールまとめ
分析業務等でデータを集約する際、OS環境間等を移動させるファイルの「文字コード」や「改行コード」がクローズアップされる事は往々にしてある事と思います。「移行先の環境に於ける文字コードが◯◯◯◯だが、移行元のDB環境の文字コードは△△△なのでどこかで変換を掛けておく必要がある」等ですね。この場合DB側でデータをエクスポートさせる際に変換を掛けてしまえるのであればコトは簡単ですが、必ずしもそういう訳にも行かないと思います。また、DB由来のものでは無い場合(ログファイル等)そもそも変換を掛けるタイミングが無い状態で取り込まなければならないという事もあるでしょう。
当エントリではそんな時に使えそうな「文字コードや改行コードを確認・変換を掛けるツール」について、コマンドラインツールでどんなものがあるのかざっくり調べてみた内容をご紹介したいと思います。
※見出し横にある[]括弧での記載は「[文]:文字コードに対応」「[改]:改行コードに対応」の意です。記載のコード確認または変換に対応している、という形となります。
目次
Linux/Unix環境
nkfコマンド[文][改]
文字コード及び改行コード変換で一番使い勝手が良いであろうツールとなると、やはりnkfがその筆頭として挙げられるのでは無いでしょうか。Linux/Windows双方のOSに対応しており、また文字コード・改行コード双方の内容確認・変換にも対応しています。
nkf --guessで所定のファイルに対しコマンドを実行する事で文字コード及び改行コードをより詳しい形で確認する事が出来ます。
$ nkf --guess superstore-orders.csv UTF-8 (CRLF)
サンプル実装付きの情報源としては以下エントリ等が詳しいです。
odコマンド[改]
バイナリファイルを任意の表示形式(16進数や10進数など)で表示するコマンドで、Linux/Unix系のOSにははじめから入っている事が多いです。
- Linux基本コマンドTips(93):【 od 】コマンド――ファイルを8進数や16進数でダンプする - @IT
- od コマンド | コマンドの使い方(Linux) | hydroculのメモ
- UNIX「ファイル ダンプ」コマンド(Hishidama's UNIX-command "od" Memo)
ファイルの中身を任意の形式で表示する事で、実際にどのような改行文字が含まれている(使われている)かを確認する事が可能です。ちなみに表示される改行文字については以下のようなものがあります。下記ファイルの文字コードは実行の結果、「CRLF(\r\n)」を用いている事が分かりました。
- Windows系(CRLF):\r\n
- Unix系(LF):\n
- Mac OSX(CR):\r
$ od -c superstore-orders.csv | less 0000000 オ ** ** ー ** ** ダ ** ** ー ** ** I D , 0000020 受 ** ** 注 ** ** 日 ** ** , 優 ** ** 先 ** ** : 0000500 , サ ** ** プ ** ** ラ ** ** イ ** ** ヤ ** ** 0000520 ー ** ** , 配 ** ** 達 ** ** 予 ** ** 定 ** ** 0000540 日 ** ** , 発 ** ** 送 ** ** 日 ** ** \r \n 5 0000560 5 5 5 4 , 2 0 0 9 / 1 / 1 , 重 ** 0000600 ** 要 ** ** , 6 , 1 5 2 6 1 , 0 . : 0001140 ** ** ッ ** ** ク ** ** ス ** ** , 0 . 3 7 0001160 0 , E l a n , 2 0 0 9 / 2 / 2 0001200 , 2 0 0 9 / 2 / 2 \r \n 4 7 8 7 3 0001220 , 2 0 0 9 / 1 / 1 , 重 ** ** 要 ** **
fileコマンド[文][改]
- Linux基本コマンドTips(12):【 file 】コマンド――ファイル形式を確認する - @IT
- fileコマンドを使えばUTF-8のBOMの有無や改行コードがCRLFかどうかがチェックできる | オガリア 技術ブログ
fileコマンドでは(オプション指定の内容にも拠りますが)より詳細な文章形式でファイルの内容を確認する事が出来ます。
$ file superstore-orders.csv superstore-orders.csv: UTF-8 Unicode text, with very long lines, with CRLF line terminators
catコマンド[改]
- Linux基本コマンドTips(1):【 cat 】コマンド――設定ファイルの内容を簡単に確認する - @IT
- また一つ、新しい花の名前を覚えました。~出戻りプログラマの備忘録~ Linux上で改行コードを確認するコマンド
ファイルの内容表示を行うcatコマンドでも改行コードを確認する事が可能です。cat -eコマンドを実行する事で以下の様な形で改行コードの内容に応じて表示が為されますが、若干見辛い感はありますね...。
- 改行コードがLF:$
- 改行コードがCR:^M
- 改行コードがCRLF:^M$
$ cat -e superstore-orders.csv ?M-^B??M-^C??M-^CM-^@?M-^C? ID,?M-^OM-^W注?M-^W?,?M-^D??M-^EM-^H度,?M-^U??M-^GM-^O,売?M-^BM-^J?M-^J?M-^AM-^R,?M-^I??M-^U?M-^NM-^G,?M-^G??M-^M??M-^C??M-^C??M-^CM-^I,?M-^H??M-^[M-^J,?M-^MM-^X価,宣?M-^]費,?M-^Y??M-^@M-^A費?M-^T?,顧客?M-^PM-^M,?M-^C??M-^AM-^S?M-^\?M-^\M-^L,?M-^B?M-^T??M-^]M-^Q,?M-^\??M-^_M-^_,?M-^W?M-^PM-^M,顧客?M-^L??M-^HM-^F,製?M-^SM-^A?M-^B??M-^CM-^F?M-^B??M-^C??M-^C?,製?M-^SM-^A?M-^B??M-^CM-^V?M-^B??M-^CM-^F?M-^B??M-^C??M-^C?,?M-^CM-^W?M-^C??M-^CM-^@?M-^B??M-^CM-^H ID,製?M-^SM-^A?M-^PM-^M,製?M-^SM-^A説?M-^XM-^N,製?M-^SM-^A?M-^B??M-^C??M-^CM-^F?M-^CM-^J?M-^C?,製?M-^SM-^A?M-^CM-^Y?M-^C??M-^B??M-^CM-^^?M-^C??M-^B??M-^C?,?M-^B??M-^CM-^W?M-^C??M-^B??M-^C??M-^C?,?M-^EM-^M?M-^AM-^T?M-^H?M-^Z?M-^W?,?M-^Y??M-^@M-^A?M-^W?^M$ 55554,2009/1/1,?M-^GM-^M?M-^A,6,15261 ,0.04 ,?M-^@M-^Z常?M-^H?空便,-1520,1897,230393 ,954,中谷 ?M-^HM-^P?M-^C,宮?M-^N,?M-^O?M-^^M-^W,?M-^]?M-^^,Morris,?M-^O?M-^O模?M-^K業?M-^IM-^@,?M-^K?M-^KM-^Y?M-^T??M-^SM-^A,?M-^Y,P1186,Xerox 1939,This is the field which has product description for Xerox 1939,?M-^O?M-^^M-^K?M-^CM-^\?M-^CM-^C?M-^B??M-^B?,0.370 ,Elan,2009/2/2,2009/2/2^M$
iconvコマンド[文]
iconvコマンドはLinux/Unixコマンドで利用可能な文字コード変換用のコマンドです。
実行例は以下。Shist_JISのファイルをUTF-8に変換する際は以下のような形で実行する事が出来ます。
$ nkf --guess superstore-orders-shift_jis.csv Shift_JIS (CRLF) $ iconv -f SHIFT_JIS -t UTF-8 superstore-orders-shift_jis.csv > superstore-orders-utf8.csv $ nkf --guess superstore-orders-utf8.csv UTF-8 (CRLF)
ちなみにこちらのiconvコマンド、改行文字の変換までは行ってくれないようなので改行文字を含めた変換が必要となる場合は他のツールとの併用を検討すべきでしょう。
dos2unix/unix2dosコマンド[改]
名前からしてそのももズバリの両コマンド。Linux/Unix/Macでそれぞれ導入可能のようです。
- dos2unix(1) - Linux man page
- unix2dos(1) - Linux man page
- Install dos2unix on Mac OSX – Mac App Store
- CentOS7 dos2unixコマンドを使った改行コード変換
手元のMac OSX環境では片方(dos2unix)をインストールしたタイミングでもう片方(unix2dos)も導入出来てるようでした。
$ brew install dos2unix $ dos2unix --version dos2unix 7.3.5 (2017-07-04) With Unicode UTF-16 support. Without native language support. http://waterlan.home.xs4all.nl/dos2unix.html $ brew install unix2dos Warning: dos2unix 7.3.5 is already installed $ unix2dos --version unix2dos 7.3.5 (2017-07-04) With Unicode UTF-16 support. Without native language support. http://waterlan.home.xs4all.nl/dos2unix.html
見た感じこれらのコマンドでは改行コードのみ変換可能となっている様ですので、文字コード変換が必要となる場合は他ツールとの併用となりそうです。
Windows環境
「Linux/Unix環境」で紹介したツールの展開状況
まずは上記Linux/Unix環境で紹介したコマンドがWindows環境でも利用可能かどうか見てみたいと思います。
ツール | 状況 |
---|---|
nkf | Windowsインストーラは存在せず、バイナリファイルを配置 参照: How to identify and transform character codes of text files using nkf on Windows(Apr,2014) nkfを使ってファイルの文字コードを変換する | Developers.IO |
od | Windows版は存在せず。 |
file | Windows版は存在せず。 |
cat | Windows版は存在せず。コマンドそのものの代替としてはechoやtypeが挙がるが、改行コード変換の機能は無い |
iconv | Windows版あり。 参照: linux コマンドの、echo, cat, のようなことが、Windows のコマンドプロンプトでできないのか - まぁ、えぇんとちゃいますか~ LibIconv for Windows |
dos2unix unix2dos |
Windows版は存在せず。 |
Powershell[文][改]
Windows環境の場合、PowerShellの機能を使う事で文字コード・改行それぞれを変換する事は可能のようです。以下に参考リンクを展開します。入出力ファイルそれぞれの仕様が決まった形であればこの選択肢も有力なものとなるのではないでしょうか。
改行コード
- 山市良のうぃんどうず日記(65):PowerShellのちょっとしたTips――改行コードを一括変換する (2/2) - @IT
- テキストファイルの改行コードをCR+LFをLFに変換する - Gブログ
- PowerShell で文字コードと改行コードの変換 - Qiita
文字コード
まとめ
という訳で、ファイルの文字コード・改行コード確認及び変換を行う時に利用可能な「コマンドラインツール」群のまとめご紹介でした。この他にも「こういう便利なツールがあるよ」とか「いや、そのツールはWindowsでも使えるぞ」とかありましたらご指摘・コメント頂けますと幸いです。適切なツールを適切なタイミングで活用してデータ移行・変換作業を効率良く行いたいものですね。