为什么我不能从CSV文件中删除标题行?

时间:2016-03-11 19:56:06

标签: ruby csv

我最难删除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”。

2 个答案:

答案 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;要做到这一点,因为它似乎很简单,但我没有找到比这个基本方法更好的。