ruby/サンプル/Ruby1.8 FasterCsvでCSVファイルの読み書き+ソート
サンプルソース
# Ruby1.8+FasterCsv
# FasterCsvでCSVファイルの読み書き+ソート
require 'rubygems'
require 'fastercsv'
# 構造体Memberを作成
Member = Struct.new("Member", :name, :age)
# Member構造体の配列作製
ary = Array.new
ary << Member.new("ちゃぱてぃ", 12)
ary << Member.new("ぶるーべれー", 13)
ary << Member.new("ゴードン", 12)
ary << Member.new("パレット", 13)
ary << Member.new("ミハエル", 12)
ary << Member.new("イチロー", 11)
ary << Member.new("スジャータ", 11)
ary << Member.new("マキシム", 11)
puts "CSV出力開始"
# Member構造体の配列を標準出力に出力
# CSVファイルを開く。書き込み、ダブルクオーテーション囲み
FasterCSV.open("faster2.csv", "w", {:force_quotes => true}) do |csv|
for row in ary
# Member構造体を一行ずつCSV出力
csv << row
end
end
puts "CSV出力終了"
# 配列をクリア
ary.clear
puts "CSV読込開始"
# CSVファイルを読み込み一行ずつ処理をする
# 読み込む時は{:force_quotes => true}がなくても大丈夫です
FasterCSV.foreach("faster2.csv") do |row|
member = Member.new
member.name = row[0]
member.age = row[1].to_i
ary.push member
end
puts "CSV読込終了"
puts "配列ソート開始"
ary = ary.sort{|a, b|
if a.age != b.age
# 年齢を比較
a.age <=> b.age
else
# 年齢が同じ場合名前を比較
a.name <=> b.name
end
}
# 項目1つだけのソートならもっと簡単、以下のコメントを外すと年齢だけでソートします
# ary = ary.sort{|a, b|
# a.age <=> b.age
# }
puts "配列ソート終了"
# ソート後の配列をCSVに出力します
puts "CSV出力開始(ソート後)"
FasterCSV.open("faster2_2.csv", "w", {:force_quotes => true}) do |csv|
for row in ary
csv << row
end
end
puts "CSV出力終了(ソート後)"
実行結果のCSVファイル faster2.csv
"ちゃぱてぃ","12"
"ぶるーべれー","13"
"ゴードン","12"
"パレット","13"
"ミハエル","12"
"イチロー","11"
"スジャータ","11"
"マキシム","11"
実行結果のCSVファイル faster2_2.csv
"イチロー","11"
"スジャータ","11"
"マキシム","11"
"ちゃぱてぃ","12"
"ゴードン","12"
"ミハエル","12"
"ぶるーべれー","13"
"パレット","13"
- ソート後の出力なので、2列目の年齢と、1列目の名前でソートされています。
ソート部分だけ抜き取り
puts "配列ソート開始"
ary = ary.sort{|a, b|
if a.age != b.age
# 年齢を比較
a.age <=> b.age
else
# 年齢が同じ場合名前を比較
a.name <=> b.name
end
}
# 項目1つだけのソートならもっと簡単、以下のコメントを外すと年齢だけでソートします
# ary = ary.sort{|a, b|
# a.age <=> b.age
# }
puts "配列ソート終了"
- Rubyは構造体を詰め込んだ配列のソートも、とても簡単に作れてすごいと思いました。
- <=>はRubyの大小比較演算子で、1,0,-1のいずれかに判定されます
コメント
最終更新:2013年01月27日 01:03