ファイルの文字コード&改行コードを確認・変換するためのツールまとめ

ツール

分析業務等でデータを集約する際、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にははじめから入っている事が多いです。

ファイルの中身を任意の形式で表示する事で、実際にどのような改行文字が含まれている(使われている)かを確認する事が可能です。ちなみに表示される改行文字については以下のようなものがあります。下記ファイルの文字コードは実行の結果、「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コマンド[文][改]

fileコマンドでは(オプション指定の内容にも拠りますが)より詳細な文章形式でファイルの内容を確認する事が出来ます。

$ file superstore-orders.csv 
superstore-orders.csv: UTF-8 Unicode text, with very long lines, with CRLF line terminators

 

catコマンド[改]

ファイルの内容表示を行う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でそれぞれ導入可能のようです。

手元の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の機能を使う事で文字コード・改行それぞれを変換する事は可能のようです。以下に参考リンクを展開します。入出力ファイルそれぞれの仕様が決まった形であればこの選択肢も有力なものとなるのではないでしょうか。

改行コード

文字コード

 

まとめ

という訳で、ファイルの文字コード・改行コード確認及び変換を行う時に利用可能な「コマンドラインツール」群のまとめご紹介でした。この他にも「こういう便利なツールがあるよ」とか「いや、そのツールはWindowsでも使えるぞ」とかありましたらご指摘・コメント頂けますと幸いです。適切なツールを適切なタイミングで活用してデータ移行・変換作業を効率良く行いたいものですね。

AWS Cloud Roadshow 2017 福岡