如何跳过CSV文件的第一行并将第二行作为标题

时间:2014-11-12 21:26:35

标签: ruby csv

有没有办法跳过CSV文件的第一行并使第二行充当标题?

我有一个CSV文件,第一行的日期和第二行的标题,所以我需要能够在迭代时跳过第一行。我尝试使用slice但是将CSV转换为数组,我真的想将其读作CSV,以便我可以利用标头。

5 个答案:

答案 0 :(得分:4)

我不认为这是一种优雅的方式,但可以做到:

require "csv"

# Create a stream using the original file.
# Don't use `textmode` since it generates a problem when using this approach.
file = File.open "file.csv"

# Consume the first CSV row.
# `\r` is my row separator character. Verify your file to see if it's the same one.
loop { break if file.readchar == "\r" }

# Create your CSV object using the remainder of the stream.
csv = CSV.new file, headers: true

答案 1 :(得分:4)

根据您的数据,您可以使用skip_lines - 选项

的其他方法

此示例跳过所有带有前导#

的行
require 'csv'

CSV.parse(DATA.read,:col_sep=>';',:headers=>true,
    :skip_lines=> /^#/  #Mark comments!
  ) do |row|
  p row
end
#~ 
__END__
#~ Comment
#~ More comment
a;b;c;d
1;2;3;4
#~ More comment
1;2;3;4
#~ More comment
1;2;3;4

结果是

#<CSV::Row "a":"1" "b":"2" "c":"3" "d":"4">
#<CSV::Row "a":"1" "b":"2" "c":"3" "d":"4">
#<CSV::Row "a":"1" "b":"2" "c":"3" "d":"4">

在您的情况下,csv包含日期,因此您可以使用:

require 'csv'

CSV.parse(DATA.read,:col_sep=>';',:headers=>true,
    :skip_lines=> /^\d\d\d\d-\d\d-\d\d$/  #Skip line with date only
  ) do |row|
  p row
end
#~ 
__END__
2016-03-19
a;b;c;d
1;2;3;4
1;2;3;4
1;2;3;4

或者您可以使用更多延伸起始线:

require 'csv'

CSV.parse(DATA.read,:col_sep=>';',:headers=>true,
    :skip_lines=> /^Created by/  #Skip line with date only
  ) do |row|
  p row
end

__END__
Created by test.rb on 2016-03-19
a;b;c;d
1;2;3;4
1;2;3;4
1;2;3;4

答案 2 :(得分:0)

我有同样的问题(除了我想在开头跳过超过1行)并且在寻找一个好的解决方案时遇到了这个问题。对于我的情况,我使用了this answer to a similar question中描述的代码,除了我正在使用你提到的标题选项。

CSV.parse(File.readlines(path).drop(1).join, headers: true) do |row|
  # ... now I can use: row['column_name']
end

答案 3 :(得分:0)

你可以这样做

text = File.readlines("file.csv")[1..-1].join()
csv = CSV.parse(text, headers: true)

答案 4 :(得分:-1)

这个简单的代码对我有用。您可以读取CSV文件并忽略其第一行,即标题或字段名称:

CSV.foreach(File.join(File.dirname(__FILE__), filepath), headers: true) do |row|
    puts row.inspect
end

您可以使用row执行任何操作。别忘了使用headers: true