FasterCSV::Tableでヘッダが取得できるけど空セルに注意

罠っていうかたぶん FasterCSV の理解が足りないだけなんだけど。

FasterCSV::Table なら header を取得できる

Rails の seed data を取り込む際に

FasterCSV.open( PATH, { :headers           => true,
                        :header_converters => :symbol } ) { |csv|
  ...
}

みたいにするコードはよく見かけると思うんだけど、open だと header を取得することができない。

irb(main):001:0> f = FasterCSV.open( '/path/to/csv', :headers => true )
<CSV.open( '/path/to/csv', :headers => true )
=> <#FasterCSV io_type:File io_path:"/path/to/csv" lineno:0 \
col_sep:"," row_sep:"\n" quote_char:"\"" headers:true>
irb(main):002:0> f.headers
f.headers
NoMethodError: undefined method `headers' for #<FasterCSV:0x143f084>
	from (irb):1

リファレンスを眺めていたら FasterCSV::Table だとできるらしい。

irb(main):003:0> g = FasterCSV.table( '/path/to/csv', :headers => true )
<CSV.table( '/path/to/csv, :headers => true )
=> #<FasterCSV::Table mode:col_or_row row_count:8>
irb(main):004:0> g.headers
g.headers
=> [:name, :code]

おぉ、取れた。

FasterCSV::Table のデフォルトでは空セルが 0 になる

変更方法があるのかどうか分からないけど、

FasterCSV.table( '/path/to/csv', :headers => true ) { |csv|
  ...
}

ってそのままやると空セルが 0 になっちゃう。:skip_blanks っていう option が default false で存在してるので true にしてみたけど変わらず。

仕方ないので中身を取得するのに普通に open で開き直すことにした。

なんか納得いかない。

More