On Jul 22, 2007, at 5:11 AM, Hu Ma wrote:

> Hello James,

Hello.

> Thanks for the answer.

Sure.

> The code that you presented gave me some ideias, however I still don't
> know the best way to overcome some problems:
> - What is the best way to convert a column to boolean values?

See below.

> - The csv file can have a column that has both float and integer  
> values
> in it. In this case I want to create a float column in the database.

You can force the column to a float.  See below.

> - Is there a way to avoid the duplicating of information? The example
> you gave shows the same classes twice.

My example showed the classes for two rows of data.  They had the  
same classes.  Nothing was "duplicated" though.

> To better ilustrate the problems here is one sample:
> data = <<-END
>       string,number,boolean
>       James,32,true
>       Dana,33.21,false
> END

Here's how I would handle that data:

#!/usr/bin/env ruby -wKU

require "rubygems"
require "faster_csv"

data = <<-END
string,number,boolean
James,32,true
Dana,33.21,false
END

BOOLS = {"true" => true, "false" => false}
parsed = FCSV.parse(
   data,
   :headers           => true,
   :header_converters => :symbol,
   :converters        => [
     lambda { |f, i| i.header == :number  ? Float(f) : f },
     lambda { |f, i| i.header == :boolean ? BOOLS[f] : f }
   ]
)

p parsed.to_a
# >> [[:string, :number, :boolean], ["James", 32.0, true], ["Dana",  
33.21, false]]

__END__

Hope that helps.

James Edward Gray II