CSV Import Issue

48 views
Skip to first unread message

Rahul B.

unread,
May 1, 2012, 12:29:32 PM5/1/12
to rubyonra...@googlegroups.com
Hi, This seems to be a very small error but I cannot find any solution
to this problem.. I am trying to use the CSV gem in my rails(3.2)
application(ruby 1.9.3) and I am getting an error "NoMethodError". My
controller is:
require 'csv'

def import
file = params[:file] <-- error
CSV.parse(file, :headers => false) do |row|
Event.new(:Ename => row[0], :Edate => row[1], :Elocation =>
row[2], :Edesc => row[3], :Oname => row[4], :Oemail => row[5], :Odetail
=> row[6])
end
end

I am getting this file from a view where the users can upload the csv
file. I am getting a NoMethodError(undefined method 'nil' for
nil:NilClass). My best guess is I am using this method wrong, but then
my next question is how to parse the Csv data? I want to retrieve the
file from my view and then parse the data into the database. How can I
open the file for the same? Is the above method not correct?

--
Posted via http://www.ruby-forum.com/.

Michael Pavling

unread,
May 1, 2012, 12:33:46 PM5/1/12
to rubyonra...@googlegroups.com
On 1 May 2012 17:29, Rahul B. <li...@ruby-forum.com> wrote:
> I am getting an error "NoMethodError".

The error would have told you which line and file the error was on. If
you can share that information, then it may be easier to help suggest
solutions.

Rick

unread,
May 1, 2012, 2:07:16 PM5/1/12
to rubyonra...@googlegroups.com
You'll probably have better results if you use the read method.  CSV.parse is meant to be applied to a String.

From the docs:
*************

parse( str, options = Hash.new ) { |row| ... } click to toggle source
parse( str, options = Hash.new )

This method can be used to easily parse CSV out of a String. You may either provide a block which will be called with each row of the String in turn, or just use the returned Array of Arrays (when no block is given).

You pass your str to read from, and an optional options Hash containing anything CSV::new() understands.

read(path, *options)

Use to slurp a CSV file into an Array of Arrays. Pass the path to the file and any options CSV::new() understands. This method also understands an additional :encoding parameter that you can use to specify the Encoding of the data in the file to be read. You must provide this unless your data is in Encoding::default_external(). CSV will use this to determine how to parse the data. You may provide a second Encoding to have the data transcoded as it is read. For example, encoding: "UTF-32BE:UTF-8" would read UTF-32BE data from the file but transcode it to UTF-8 before CSV parses it.

readlines(*args)

Alias for CSV::read().

table(path, options = Hash.new)

A shortcut for:

CSV.read( path, { headers:           true,
                  converters:        :numeric,
                  header_converters: :symbol }.merge(options) )

*************

Reply all
Reply to author
Forward
0 new messages