Ruby1.8とFasterCsvでCSVファイルを読み書き(ダブルクォーテーション付き)するサンプルです。

目次


サンプルソース

# Ruby1.8+FasterCsv
# FasterCsvでCSVファイルの読み書き(ダブルクォーテーション付き
require 'rubygems'
require 'fastercsv'
 
# 構造体Memberを作成
Member = Struct.new("Member", :name, :email, :age)
 
# Member構造体の配列作製
ary = Array.new
ary << Member.new("ちゃぱてぃ", "chapati@example.com", 12)
ary << Member.new("ぶるーべれー", "blueberet@example.com", 13)
 
puts "CSV出力開始"
# Member構造体の配列を標準出力に出力
puts ary
 
# CSVファイルを開く。書き込み、ダブルクオーテーション囲み
FasterCSV.open("faster.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("faster.csv") do |row|
  member = Member.new
  member.name = row[0]
  member.email = row[1]
  member.age = row[2].to_i
  ary.push member
end
 
# CSVの読み込み結果を標準出力に出力
puts ary
puts "CSV読込終了"
 

解説

  1. 名前、メールアドレス、年齢の要素を持つ構造体「Member」作成し
  2. 配列に構造体「Member」でCSVに出力する内容を作成
  3. CSVに出力後、配列をクリアして
  4. 出力した内容を再度読み込んで見るサンプルです。

  • ダブルクォーテーションで囲んだCSVにするには、ファイルを開く時、以下のように「:force_quotes => true」を追加します。
    • 出力する要素の中にカンマが入っていると、自動的にダブルクォーテーション囲みになるのですが、これは常に囲むように強制するオプションです。
FasterCSV.open("faster.csv", "w", {:force_quotes => true}) do |csv|
 

  • 読み込みでは、オプションを付けなくても自動的にダブルクォーテーションを外して要素を取り出してくれます。
  • 今回、構造体を作るクラス「Struct」を使ってみましたが、凄い便利ですね。
  • CSVクラスにぽいと渡すだけで、中の変数をCSVに出力してくれました。

実行結果(コンソール

CSV出力開始
#<struct Struct::Member name="\343\201\241\343\202\203\343\201\261\343\201\246\343\201\203", email="chapati@example.com", age=12>
#<struct Struct::Member name="\343\201\266\343\202\213\343\203\274\343\201\271\343\202\214\343\203\274", email="blueberet@example.com", age=13>
CSV出力終了
CSV読込開始
#<struct Struct::Member name="\343\201\241\343\202\203\343\201\261\343\201\246\343\201\203", email="chapati@example.com", age=12>
#<struct Struct::Member name="\343\201\266\343\202\213\343\203\274\343\201\271\343\202\214\343\203\274", email="blueberet@example.com", age=13>
CSV読込終了
 

実行結果(CSVファイル

"ちゃぱてぃ","chapati@example.com","12"
"ぶるーべれー","blueberet@example.com","13"
 
  • 「:force_quotes => true」をつけたので、全ての要素がダブルクォーテーションで囲まれています。

蛇足

  • Rubyには標準でCSVファイルを扱うクラスがあります(便利!)
  • ですが、このクラスがあまり早くないとの事で
  • FasterCsvというクラスが人気を集めており、Ruby1.9ではFasterCsvを元にして標準のCSVクラスが修正されたそうです。

サンプルダウンロード


コメント

名前:

添付ファイル