CSV ::无法将String转换为Integer

时间:2013-08-30 05:05:23

标签: ruby-on-rails-3 csv import

我想将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文件中获取整个值为

productname,release_date

xxx,yyy

在我的日志中。

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

如何纠正此错误?

2 个答案:

答案 0 :(得分:1)

看起来您实际上期待的是FasterCSV API,它支持parse(csv_text, :headers => true)之类的签名。

在Ruby版本1.9中,stdlib中的CSV库已替换为FasterCSV库。您的代码看起来可能在Ruby 1.9 +中直接起作用。

如果你想使用FasterCSV样式API而不升级到更新的Ruby,你可以抓住gem并使用它代替CSV

require 'fastercsv'
csv_text = File.read('test.csv')
csv = FasterCSV.parse(csv_text, :headers => true)
csv.each do |row|
  puts row['productname']
end

答案 1 :(得分: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在您的情况下是ArrayArray[]Integer作为参数, not a String`,这就是您收到错误的原因。

换句话说; row['anything']无效,row[0]row[1]将为您提供该行第1列和第2行的值。

现在,在您的情况下,您实际上是这样调用CSV.parse

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

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

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