Memoize |
BasicWerk
EC Support
Technique
Facebook
|
20140817172109_ruby_csv_to_struct |
|
ruby_csv_to_struct
(あまり大きなファイルにはお勧めできないが)CSV ファイルの各行を一つの Struct として一気に読み込んで配列に格納する。 sample.csv % cat sample.csv id,name,price,currency 1,item-A,2980,JPY 2,item-B,900,JPY 3,item-C,3980,JPY 4,item-D,1980,JPY file_open_to_struct.rb
#! /usr/bin/ruby
# coding: utf-8
s = Struct.new(:id, :name, :price, :currency)
data = []
File.open("sample.csv") do |fh|
fh.each do |line|
cols = line.chomp.split(/,/)
data << s.new(*cols)
end
end
p data.collect {|s| s.id}
# => ["id", "1", "2", "3", "4"]
p data.collect {|s| s.name}
# => ["name", "item-A", "item-B", "item-C", "item-D"]
p data.find {|s| s.id == "4"}
# => #<struct id="4", name="item-D", price="1980", currency="JPY">
辞書的に参照したい比較的小さなファイルを読み込むためのテクニックとしては使えると思う。
ちなみにこの部分、 cols = line.chomp.split(/,/) data << s.new(*cols) cols は line を chomp して , で区切った文字列のリストを配列で受け取る。 s.new に引数として与える段階で *cols とすることで、配列の中の文字列を個々の引数に展開する(バラす)。
|
| © Shin Nakamura/BasicWerk 2014 |