罠っていうかたぶん 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 で開き直すことにした。
なんか納得いかない。