打开CSV而不读取Ruby中的标题行

时间:2015-08-26 19:12:48

标签: ruby csv

我使用Ruby打开CSV:

CSV.foreach(file_name, "r+") do |row|
  next if row[0] == 'id'
  update_row! row    
end

我并不关心标题行。

我不喜欢内部循环next if row[1] == 'id'。有没有告诉CSV跳过标题行并只是遍历带有数据的行?

我假设提供的CSV总是有一个标题行。

3 个答案:

答案 0 :(得分:3)

有几种方法可以解决这个问题。最简单的方法是将{headers: true}选项传递给循环:

CSV.foreach(file_name, headers: true) do |row|
  update_row! row    
end

注意没有指定模式 - 这是因为根据文档,CSV::foreach只接受文件和选项哈希作为其参数(而不是CSV::open,其中 允许指定模式。

或者,你可以在迭代它之前将数据读入数组(而不是使用foreach)和shift数组:

 my_csv= CSV.read(filename)
 my_csv.shift
 my_csv.each do |row|
     update_row! row 
 end

答案 1 :(得分:1)

根据Ruby doc

options = {:headers=>true}
CSV.foreach(file_name, options) ...

应该足够了。

答案 2 :(得分:0)

在逐行阅读文件时,一件简单的事情就是:

CSV.foreach(file_name, "r+") do |row|
  next if $. == 1
  update_row! row    
end

$.是Ruby中的一个全局变量,它包含正在读取的文件的行号。