【问题标题】:CSV::can't convert String into IntegerCSV:: 无法将字符串转换为整数
【发布时间】:2013-08-30 05:05:23
【问题描述】:

我想将 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。

我该如何纠正这个错误?

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      来自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 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 的第二个参数,您应该更接近您的预期。

      【讨论】:

      • 哦,就是这个意思。通过阅读更多文档更新了我的答案。
      猜你喜欢
      • 2012-10-22
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多