On Jan 5, 2007, at 12:36 PM, Jon Egil Strand wrote:

>
> Greetings
>
> Do we have an object relational mapper for csv files?
>
>   #data:
>    first_name;last_name;phone
>    peter;pan;12345
>
>   #ROW ACCESS
>     person.first_name => "peter"
>     person.last_name => "pan"

First idea:

#!/usr/bin/env ruby -w

require "rubygems"
require "faster_csv"

require "ostruct"

# load
people = FCSV( DATA, :col_sep           => ";",
                      :headers           => true,
                      :header_converters => :symbol ) do |csv|
   csv.inject(Array.new) { |all, person| all + [OpenStruct.new 
(person.to_hash)] }
end

# example usage
puts people.map { |person| person.first_name }

__END__
First Name;Last Name;Phone
Peter;Pan;111-1111
Wendy;Darling;222-2222

Second idea, if you are in control of the CSV data:

#!/usr/bin/env ruby -w

require "rubygems"
require "faster_csv"

require "pp"

Person = Struct.new(:first_name, :last_name, :phone)

people = [ %w[Peter Pan 111-1111],
            %w[Wendy Darling 222-2222] ].inject(Array.new) do |all,  
attrs|
   all + [Person.new(*attrs)]
end

# dump
csv = FCSV.dump(people)
puts csv
puts

# load
reloaded = FCSV.load(csv)
pp reloaded
puts

# use
puts reloaded.map { |person| person.first_name }

Hope one of those helps.

James Edward Gray II