wataradioの日記

2008-07-06

RubyでCSVを扱うときは配列をハッシュにすると便利な件

| 00:39

RubyCSVを扱う場合は標準ライブラリCSVか、FasterCSVを使うことが多いと思います。どちらのライブラリも以下のような感じでCSVの1行を配列にしてブロックに渡してくれます。

CSV.open("test.csv", 'r') do |row|
  p row # => ["Yamada", "30", "180"]
  p row[0] # => "Yamada"
  p row[1] # => "30"
  p row[2] # => "180"
end

このときCSVのカラム数が少なければrow[0], row[1]のようにして配列インデックスアクセスで十分なのですが、カラム数が多くなると、あのデータは何カラム目にあるだっけ? となることがよくあります。

そこでハッシュですよ。

例えば、CSVデータが名前、年齢、身長の順に並んでいるなら、以下のようにカラム名をキーとしたハッシュにすると便利です。

keys = [:name, :age, :height]
CSV.open("test.csv", 'r') do |row|
  p hashed_row = Hash[*keys.zip(row).flatten] # => {:age=>"30", :height=>"180", :name=>"Yamada"}
  p hashed_row[:name]   # => "Yamada"
  p hashed_row[:age]    # => "30"
  p hashed_row[:height] # => "180"
end
Connection: close