在Ruby中读取CSV时如何跳过标题行?

Ruby的CSV类可以很容易地遍历每一行:

 CSV.foreach(file) { |row| puts row } 

但是,这总是包含标题行,所以我将得到输出:

 header1, header2 foo, bar baz, yak 

我不想要标题。 现在,当我打电话给…

 CSV.foreach(file, :headers => true) 

我得到这个结果:

 # 

当然,因为文档说:

此设置使#shift将行返回为CSV :: Row对象而不是Arrays

但是, 如何跳过标题行,将行作为简单数组返回? 我不希望返回复杂的CSV::Row对象。

我绝对不想这样做:

 first = true CSV.foreach(file) do |row| if first puts row first = false else # code for other rows end end 

从CSV类看#shift

包装字符串和IO的主要读取方法,从数据源中提取单行,解析并作为字段数组返回(如果未使用标题行)

一个例子:

 require 'csv' # CSV FILE # name, surname, location # Mark, Needham, Sydney # David, Smith, London def parse_csv_file_for_names(path_to_csv) names = [] csv_contents = CSV.read(path_to_csv) csv_contents.shift csv_contents.each do |row| names << row[0] end return names end 

您可能需要考虑CSV.parse(csv_file, { :headers => false })并传递一个块,如此处所述

忽略标题的一种很酷的方法是将其作为数组读取并忽略第一行:

 data = CSV.read("dataset.csv")[1 .. -1] # => [["first_row", "with data"], ["second_row", "and more data"], ... ["last_row", "finally"]] 

:headers => false方法的问题是CSV不会尝试将第一行作为标题读取,但会将其视为数据的一部分。 所以,基本上,你有一个无用的第一行。