James Gray
1/5/2007 8:19:00 PM
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