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