コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

BOM付きのCSVをRubyのCSVクラスでreadする

header:true しようとしたらできなかったのでそのメモ

環境

$ ruby -v
ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-darwin18]

どういうことか

BOM付きのファイルを CSV クラスで読み込むと、先頭行にBOMの情報がついてしまう。そのため、headerのオプションを指定しても、そのheader名で値が取れなくなってしまう。

このBOMはExcelのデータをcsv形式で保存すると起きる。

例えば以下の内容をもつ profile.csv があるとする

id,name,age
1,Taro,10
2,Ziro,11
3,Saburo,12

BOM付きの場合、headerの前に余計な文字列情報がつく

CSV.read('profile.csv',headers: true).headers
# => ["<feff>id", "name", "age"]

やり方

エンコーディングにBOMをつけることで回避することができる。

CSV.read('profile.csv', encoding: 'BOM|UTF-8'  ,headers: true).headers
# => ["id", "name", "age"]

参考リンク