我想将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转换为整数。
如何纠正此错误?
答案 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
在您的情况下是Array
。 Array[]
将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
的第二个参数,你应该更接近你的期望。