LoginSignup
3
1

More than 3 years have passed since last update.

Rubyで文字コードや区切りを指定して、CSVを読み込む

Last updated at Posted at 2019-12-11

TL;DR

一括読み取る

CSV.table('path/to/tsv', encoding: 'utf-16', col_sep: "\t")

注意:
1. BOM付きUTF-8など扱う時、 encoding: 'bom|utf-8' を使うと便利です。
2. システム内でUTF-8以外のエンコードで処理したい場合はencoding: 'utf-16:Shift_JIS'のような書き方が可能です。
3. 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から非推奨になりました

参考

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1