0

我想将 csv 文件导入我的数据库。我正在使用 Ruby 1.8.7 和 Rails 3.2.13 以及 gem 'csv_importer'。

我要从 csv 文件中获取 productname 和 release_date

在我的控制器中

 def import
        csv_text = File.read('test.csv')
        csv = CSV.parse(csv_text, :headers => true)
        csv.each do |row|
            puts row  #getting entire values from csv 
            puts row['productname'] #getting error
 end  

如果我打印行/行 [0],我将从 csv 文件中获取整个值

产品名称,发布日期

xxx,yyy

在我的日志中。

如果我打印 row['productname'],我会收到错误,因为无法将 String 转换为 Integer。

我该如何纠正这个错误?

4

2 回答 2

1

看起来您实际上期待的是FasterCSV API,它确实支持像parse(csv_text, :headers => true).

In Ruby version 1.9 the CSV library in stdlib was replaced with the FasterCSV library. Your code looks like it might work straight up in Ruby 1.9+.

If you want to use the FasterCSV style API without upgrading to a newer Ruby, you can grab the gem and use it instead of CSV:

require 'fastercsv'
csv_text = File.read('test.csv')
csv = FasterCSV.parse(csv_text, :headers => true)
csv.each do |row|
  puts row['productname']
end
于 2013-09-20T08:30:12.413 回答
0

来自http://ruby-doc.org/stdlib-1.8.7/libdoc/csv/rdoc/CSV.html#method-c-parse

CSV.parse(str_or_readable, fs = nil, rs = nil, &block)

从给定的字符串或流中解析行。将行作为数组数组返回。

...所以row在你的情况下是一个Array. Array[]接受一个Integer作为参数, not aString`,这就是您收到错误的原因。

换句话说; row['anything']不能工作,但row[0]row[1]为您提供该行第 1 列和第 2 列的值。

现在,就您而言,您实际上是CSV.parse这样调用的:

CSV.parse(csv_text, :headers => true)

查看文档,我们看到第二个参数CSV.parse是字段分隔符。您:headers => true作为字段分隔符传递。这告诉CSV它在遇到字符串时分割每一行"headerstrue"- 它没有,所以它不会分割每一行。

如果您删除第二个参数,CSV.parse您应该更接近您的预期。

于 2013-09-19T19:35:27.680 回答