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出力結果です

実行結果の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のいずれかに判定されます

コメント

名前: