Excel からの出力
[ファイル]-[名前を付けて保存] でフォーマットを CSV (コンマ区切り)
で保存すると、Shift_JIS の CSV が出力される。
しかし、Excel は内部では Unicode を使ってるため、一部の文字が欠損する。また、Windows 版と Mac 版で使用する文字セットが異なり、文字化けする。
そのため、フォーマットは UTF-16 Unicode テキスト
にする。これで UTF-16LE (BOM つき)、列区切り \t
、行区切り \r\n
の CSV (TSV) が出力される。
Ruby で読み込み
下記はコマンドライン引数に指定した CSV を読み込んで、行を p
で表示するコード。
require "csv"
# BOM でバイトオーダーを判定したうえで BOM を削除して UTF-8 に変換しつつ読み込み。
open(ARGV.first, "rb:BOM|UTF-16:UTF-8"){|f|
# 列区切り文字 (col_sep), 行区切り文字 (row_sep) を指定
# headers: :first_row は最初の行をヘッダとみなすオプション
CSV.new(f, col_sep: "\t", row_sep: "\r\n", headers: :first_row).each do |row|
# セル内改行は Win だと CRLF、Mac だと CR になる。面倒なので LF に統一する。
row.each{|k, v| v.gsub!(/(\r\n|\r)/, "\n") unless v.nil? }
p row
end
}
Rails での日時の扱い
直接 CSV とは関係ないが、CSV からインポートする際などに、時差による問題が起こりやすい。
日付をパースする場合は ActiveSupport::TimeZone#parse
を使ってタイムゾーンを明示するのが確実。
ActiveSupport::TimeZone["Asia/Tokyo"].parse("2014/4/15 12:00:00") #=> Tue, 15 Apr 2014 12:00:00 JST +09:00