我最难删除CSV文件的标题行。
这是我编写的一些代码,用于生成来自第三方电子邮件服务的帐户ID列表,用于确定帐户是否有效。
这是CSV生成器代码:
CSV.foreach('complete_failed_list.csv', {headers: false}) do |failed_csv_list|
CSV.open("failed_id_list.csv", "a", {headers: false}) do |csv|
csv << [failed_csv_list[0]]
end
end
这会创建一个CSV文件,格式如下:
id
1
2
3
我不想要id
标题但是,即使我指定headers: false
,仍然有标题!我想摆脱它,但我不能手动删除它,因为我在Mac上,我必须将文件保存为数字“.numbers”文件,而不是“.csv”。
答案 0 :(得分:1)
设置csv headers
选项仅确定返回的结果行是否作为数组或由csv中的第一行键入的哈希值返回。通过设置{ headers: true }
,您基本上可以跳过标题行,但必须使用键而不是索引来访问这些值。见下文。
CSV.foreach('complete_failed_list.csv', {headers: true}) do |failed_csv_list|
CSV.open("failed_id_list.csv", "a", {headers: false}) do |csv|
csv << [failed_csv_list['id']]
end
end
可以找到有关接受哪些选项的更多信息here。我也使用了return_headers
选项,但就foreach迭代的内容而言似乎并不重要。
答案 1 :(得分:0)
指定headers
选项会告诉Ruby您是否希望数据包含标题,如果设置headers: true
,您实际上可以通过标题名称访问数据中的列。见&#34; A Guide to the Ruby CSV Library, Part II&#34;了解更多细节。
但是,您仍在迭代数据中的每一行,因此您将标题行转储到目标文件中。来自CSV.foreach
文档:
文件的每一行将依次传递给提供的
block
。
我经常做的事情是在迭代之前设置一个跳过标题的标志,然后跳过第一步:
skip_headers = true
CSV.foreach('complete_failed_list.csv') do |failed_csv_list|
if skip_headers
skip_headers = false # Make sure to change the flag or you will skip every row
next # Move to the next step in the iteration
end
CSV.open("failed_id_list.csv", "a") do |csv|
csv << [failed_csv_list[0]]
end
end
我也试图找到更多&#34; Ruby-way&#34;要做到这一点,因为它似乎很简单,但我没有找到比这个基本方法更好的。