[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Jon Egil Strand

1/5/2007 6:37:00 PM

6 Answers

James Gray

1/5/2007 8:19:00 PM

0

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

Gregory Brown

1/5/2007 8:25:00 PM

0

On 1/5/07, Jon Egil Strand <jes@luretanker.no> 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"
>
>
>
> Even nicer if it header_row and separation_character can be specified?
>
>
> I've considered csvparser-0.1.1 and FasterCSV, but as far as I can tell
>
> - csvparser is a little thin on header_row/sep_char
> - FasterCSV's synax
> table[:first_name][1]
> this kind'o does the job, but I would prefer the implementation of
> the datasource to be a bit less visible in the rest of the app

Have you considered Ruport?

Gregory Brown

1/5/2007 8:26:00 PM

0

On 1/5/07, Gregory Brown <gregory.t.brown@gmail.com> wrote:
> On 1/5/07, Gregory Brown <gregory.t.brown@gmail.com> wrote:
>
> > Have you considered Ruport?
> >
>
> Should have included an example.

and the file I used! Sorry for the triple post.

seltzer:~ sandal$ cat foo.csv
first_name;last_name;phone
peter;pan;12345
joe;loop;56789

Gregory Brown

1/5/2007 8:32:00 PM

0

On 1/5/07, Gregory Brown <gregory.t.brown@gmail.com> wrote:

> Have you considered Ruport?
>

Should have included an example.

>> table = Table("foo.csv",:csv_options => { :col_sep => ";" })
>> class Ruport::Data::Record
>> def name
>> "#{first_name} #{last_name}"
>> end
>> end
=> nil
>> table.map { |r| r.name }
=> ["peter pan", "joe loop"]

Mark Volkmann

1/5/2007 8:44:00 PM

0


On Jan 5, 2007, at 2:31 PM, Gregory Brown wrote:

> On 1/5/07, Gregory Brown <gregory.t.brown@gmail.com> wrote:
>
>> Have you considered Ruport?
>>
>
> Should have included an example.
>
>>> table = Table("foo.csv",:csv_options => { :col_sep => ";" })
>>> class Ruport::Data::Record
>>> def name
>>> "#{first_name} #{last_name}"
>>> end
>>> end
> => nil
>>> table.map { |r| r.name }
> => ["peter pan", "joe loop"]

Where does the Record class get used? Does the Table class use it
internally?

Gregory Brown

1/5/2007 8:51:00 PM

0

On 1/5/07, Mark Volkmann <r.mark.volkmann@gmail.com> wrote:

> Where does the Record class get used? Does the Table class use it
> internally?

yeah. I'm currently contemplating a better alternative. That's a bit
of a hack there.

Pending user feedback, I may implement something like what is
described in this mailing list post:
http://rubyu...

I never really set out to build an ORM style thing, but since our
Tables can be built from ActiveRecord objects via acts_as_reportable,
SQL (requires DBI), CSVs, or hand built, it's starting to shape up a
bit.

I'd be interested in feedback from folks about this, but please carry
it on over to the Ruport list so I can archive it there.