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 # -> <OpenStruct country="Australia" population=20000000>
>
--
Andrew Libby
Tangeis, LLC
Innovative IT Management Solutions
alibby / tangeis.com