From: Andrew Libby Date: 2007-03-29T04:45:37+09:00 Subject: Re: code too hashy, I think Nice! That's great Brian, I love it. A quick fix to the code I posted previously makes use of this class. My class extends OpenStruct, and no longer has an @attributes attribute, or a method_missing method. Thanks! #!/usr/bin/ruby require 'csv' require 'ostruct' class ObjectCsvParser < OpenStruct def initialize(fields,values) super Hash[ *[ (0..fields.length-1).map { |i| [fields[i], values[i]] } ].flatten ] end def self.each_record(fn,&block) fields = nil CSV.open(fn,'r') do |line| if(fields == nil) fields = line.map { |l| l.downcase.to_sym } next end yield ObjectCsvParser.new(fields,line) end end end # Assuming your CSV has last, first, and email as fields ObjectCsvParser.each_record(ARGV.shift) do |record| puts "Last: " + record.last puts "First: " + record.first puts "Email: " + record.email end Brian Candler wrote: > On Thu, Mar 29, 2007 at 03:47:04AM +0900, Andrew Libby wrote: >> At the end of the day, it's a hash cloaked in object clothing. > > Perhaps you want Struct or OpenStruct (both in the standard install; for the > latter you will need to require 'ostruct.rb') > > From /usr/lib/ruby/1.8/ostruct.rb: > > # OpenStruct allows you to create data objects and set arbitrary attributes. > # For example: > # > # require 'ostruct' > # > # record = OpenStruct.new > # record.name = "John Smith" > # record.age = 70 > # record.pension = 300 > # > # puts record.name # -> "John Smith" > # puts record.address # -> nil > # > # It is like a hash with a different way to access the data. In fact, it is > # implemented with a hash, and you can initialize it with one. > # > # hash = { "country" => "Australia", :population => 20_000_000 } > # data = OpenStruct.new(hash) > # > # p data # -> > -- Andrew Libby Tangeis, LLC Innovative IT Management Solutions alibby@tangeis.com