TL;DR
一括読み取る
CSV.table('path/to/tsv', encoding: 'utf-16', col_sep: "\t")
注意:
-
BOM付きUTF-8など扱う時、
encoding: 'bom|utf-8'
を使うと便利です。 - システム内でUTF-8以外のエンコードで処理したい場合は
encoding: 'utf-16:Shift_JIS'
のような書き方が可能です。 -
col_sep: "\t"
のダブルクォーテーションをシングルにするとエラーになります。
行ごと読み取る
CSV.foreach('path/to/tsv', encoding: 'utf-16', col_sep: "\t", headers: true) do |data|
p data
end
ちなみに CSV.foreach(headers: true)
では、デフォルトのキーはStringですが、header_converters: :symbol
を設定すると、キーがSymbolになります。詳しくはこちら
NKFを使って、文字コードを推定
require 'nkf'
enc = NKF.guess(File.read('path/to/tsv', 10))
p enc.name
# => "UTF-16"
CSV.foreach('path/to/tsv', encoding: enc, col_sep: "\t", headers: true) do |data|
p data
end
おまけ
file
コマンドで文字コードの検知
$ file -b utf16.tsv
Little-endian UTF-16 Unicode text, with very long lines, with CRLF, LF line terminators
$ file -b utf8bom.tsv
UTF-8 Unicode (with BOM) text, with very long lines, with CRLF, LF line terminators
$ file -b shift_jis.tsv
Non-ISO extended-ASCII text, with very long lines, with CRLF, LF, NEL line terminators
iconv
で文字コード変換
# 変換結果を見る
$ iconv -f utf-16 -t utf-8 utf16.tsv | less
# utf8.tsvに書き込む
$ iconv -f utf-16 -t utf-8 utf16.tsv -o utf8.tsv
注意:
Rubyで使う場合、ruby/iconvというライブラリがありますが、どうやらv1.9
から非推奨になりました。