34
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Excel から CSV 出力して Ruby で読み込み

Last updated at Posted at 2014-04-16

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
34
33
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
34
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?