写入CSV返回:未定义的方法`map'表示“\ n”或“0”

时间:2017-02-17 00:49:32

标签: ruby-on-rails ruby csv

我正在尝试写入CSV,但我遇到了问题。我见过this所以我刚刚应用了解决方案,但是我收到了一个错误。 这是我的代码:

require 'csv'

data = Owner.find(2).cats
CSV.open("file.csv", "w") do |csv|
  data.each do |cat|
    csv << cat.name
  end
end

我已经在控制台中检查过,我正在获取数据for Owner.find(2).cats。 当我尝试将此内容写入CSV时,我收到错误:

  

未定义的方法`map'为0:Fixnum

当我尝试来自同一question的简单解决方案时:

require 'csv'

CSV.open("file.csv", "w") do |csv|
    csv << "\n"
end

我收到此错误:

  

“\ n”的未定义方法`map':String

你知道我做错了吗?

我是ruby的新手,所以也许我正在做一个roockie错误

2 个答案:

答案 0 :(得分:2)

require 'csv'

data = Owner.find(2).cats
CSV.open("file.csv", "w") do |csv|
  data.each { |cat| csv << [cat.name] }
end

答案 1 :(得分:2)

CSV是行的集合,每个行都是列的集合;它是一个二维数组,可以转换为文本形式。因此,顶级CSV对象希望您向其追加数组,而不是单个单元格值。

请注意,在此代码中:

CSV.open('filename','w') do |csv|
   do stuff
end

do stuff只运行一次。由您来创建CSV的结构,通常是这样的:

CSV.open('filename','w') do |csv|
  data.each |item|
    row = [item.field1, item.field2, item.field3]
    csv << row
  end
end

甚至是双循环:

CSV.open('filename','w') do |csv|
  data.each |item|
    row = []
    fields.each do |field|
       row << item[field]
    end
    csv << row
  end
end

举个例子:

$ irb
irb(main):001:0> require 'csv' #=> true
irb(main):002:0> CSV.open("cats.csv", "w") do |csv|
irb(main):003:1* csv << [ "cat1" ] << [ "cat2" ] << [ "cat3 " ]
irb(main):004:1> end
#=> <#CSV io_type:File io_path:"cats.csv" encoding:UTF-8 lineno:3 col_sep:"," row_sep:"\n" quote_char:"\"">
irb(main):005:0>
$ cat cats.csv
cat1
cat2
cat3
$

请注意,该文件中没有引号或方括号。