有人可以指出我的CSV generator.rb文件失败的原因吗?

时间:2016-03-11 18:17:36

标签: ruby csv

我有两个CSV文件。

一个文件名为complete_failed_list.csv,内容如下:

id, username, email, status, details

我想从complete_failed_list.csv创建一个名为failed_id_list.csv的新csv文件,但只保留id。

这就是我所拥有的。

require 'csv'
CSV.open('failed_id_list.csv', 'a+') do |csv_id|
   CSV.open('complete_failed_list.csv', 'r', {headers: false}) do |failed_csv_list|
      csv_id << [failed_csv_list][0]
   end
end

这个设置给了我一个错误:

failed_email_id_generator.rb:4:in `block (2 levels) in <main>': undefined method `[]' for #<CSV:0x007ff2328d5140> (NoMethodError)

我不知道我做错了什么。我只希望failed_csv_list中的第一列应该是id,然后将其附加到failed_id_list.csv。为什么这不起作用?

我第二次尝试将代码更改为:

require 'csv'
CSV.open('failed_id_list.csv', 'a+', {headers: false}) do |csv_id|
  CSV.foreach('complete_failed_list.csv', {headers: false}) do |failed_csv_list|
     csv_id << failed_csv_list[0]
  end
end

会产生新错误:

`<<': undefined method `map' for "id":String (NoMethodError)

当我想要的只是一列没有标题的id:

132
24
312
43
52

新尝试:

  • 我已指定要创建的文件failed_id_list.csv
  • 我已将failed_id_list.csv的创建设置为没有我想要的标题。
  • 然后,我阅读了包含数据complete_failed_list.csv的文档的每一行,抓住第一列并将其附加到新文档csv_id << failed_csv_list[0]

我放了一个puts "#{failed_csv_list[0]}",我可以看到打印出的ID,为什么我会收到此错误。这是什么意思?

1 个答案:

答案 0 :(得分:2)

CSV#open获取的块参数不是单行,而是CSV对象。因此,您需要在现有块中使用CSV#foreach而不是第二个CSV#openCSV#each

编辑:

CSV#<<方法需要数组作为参数,并且您传递的是标量failed_csv_list[0]。如果您只想在生成的CSV中使用一列,只需将其括在括号中:[failed_csv_list[0]]

另外,我认为你应该在变量命名方面付出更多努力。你正在做什么以及你正在使用哪种对象将更清楚。在你的情况下:

CSV.open('failed_id_list.csv', 'a+', {headers: false}) do |output_csv|
  CSV.foreach('complete_failed_list.csv', {headers: false}) do |input_row|
     output_csv << [input_row[0]]
  end
end