我有两个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,为什么我会收到此错误。这是什么意思?
答案 0 :(得分:2)
从CSV#open
获取的块参数不是单行,而是CSV对象。因此,您需要在现有块中使用CSV#foreach
而不是第二个CSV#open
或CSV#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