Ruby 跳过CSV的前5行

Ruby 跳过CSV的前5行,ruby,csv,Ruby,Csv,我相信这是微不足道的,但经过一段时间的拉扯我的头发,现在是你们友好的朋友们来救我的时候了 我想对CSV类读取的CSV文件进行操作,如下所示: CSV.foreach(@path_to_file) do |row| #doing stuff here end 但是,文件头上方有5行需要删除(当遇到这些行时,foreach方法会弹出条带) 我猜我可以在没有前5行的情况下读取文件并重新组装,但我相信有一种更优雅的方法可以做到这一点 CSV方法不起作用的原因是前5行中有CSV类不喜欢的字符;它

我相信这是微不足道的,但经过一段时间的拉扯我的头发,现在是你们友好的朋友们来救我的时候了

我想对CSV类读取的CSV文件进行操作,如下所示:

CSV.foreach(@path_to_file) do |row|
    #doing stuff here
end
但是,文件头上方有5行需要删除(当遇到这些行时,
foreach
方法会弹出条带)

我猜我可以在没有前5行的情况下读取文件并重新组装,但我相信有一种更优雅的方法可以做到这一点

CSV方法不起作用的原因是前5行中有CSV类不喜欢的字符;它返回第3行中的
CSV:malformedcsv错误:非法引用


因此,我不认为我可以使用CSV类,除非我可以让它在尝试解析CSV之前删除行。

您应该能够通过从其他不兼容的数据构造有效的CSV字符串绕过CSV模块:

csv = CSV.open @path_to_file
csv.drop(5).each do |row|
  #doing stuff here
end
CSV.parse(File.readlines(path).drop(5).join) do |row|
  # ...
end

通过从其他不兼容的数据构造有效的CSV字符串,您应该能够绕过CSV模块:

CSV.parse(File.readlines(path).drop(5).join) do |row|
  # ...
end

我尝试用一个最小的工作示例来模拟您的错误:

require 'csv'

CSV.parse(DATA.read,:col_sep=>';',:headers=>true,
  ) do |row|
  p row
end

__END__
a;b;c;d
1;2;3;4
here we have an error because there is a " in the text;
1;2;3;4
"1";"2";3;4
这将返回与您相同的错误:
第3行中的非法引用。(CSV::格式不正确的DCSVERROR)

当您知道是哪个字符串导致问题时,可以使用选项跳过该行
:skip_lines

require 'csv'

CSV.parse(DATA.read,:col_sep=>';',:headers=>true,
    :skip_lines=> /a " in the text/
  ) do |row|
  p row
end

__END__
a;b;c;d
1;2;3;4
here we have an error because there is a " in the text;
1;2;3;4
"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">
我的示例的结果还显示,如果使用引用的内容会发生什么情况(请参见最后一行):

#

# 我尝试用一个最小的工作示例来模拟您的错误:

require 'csv'

CSV.parse(DATA.read,:col_sep=>';',:headers=>true,
  ) do |row|
  p row
end

__END__
a;b;c;d
1;2;3;4
here we have an error because there is a " in the text;
1;2;3;4
"1";"2";3;4
这将返回与您相同的错误:
第3行中的非法引用。(CSV::格式不正确的DCSVERROR)

当您知道是哪个字符串导致问题时,可以使用选项跳过该行
:skip_lines

require 'csv'

CSV.parse(DATA.read,:col_sep=>';',:headers=>true,
    :skip_lines=> /a " in the text/
  ) do |row|
  p row
end

__END__
a;b;c;d
1;2;3;4
here we have an error because there is a " in the text;
1;2;3;4
"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">
我的示例的结果还显示,如果使用引用的内容会发生什么情况(请参见最后一行):

#

#除了
foreach
之外,还有其他方法,比如
open
本身,这给了您更多的灵活性。请参阅我上面的编辑,了解更多细节:问题如果您想要处理非CSV文件,您需要手动读取,去掉前五行,重新组装,然后将其转储回CSV解析器。您一开始描述的似乎是省略了前五行本来是CSV数据。如果它是CSV文件,可能您没有将其作为正确的字符编码读取。我们无法判断,因为您没有提供有问题的行,但这很容易发生。不,这只是文件顶部的一堆注释,而且CSV没有一种标准的行注释方式,因此必须对其进行预处理有点麻烦。除了
foreach
,还有其他方法,就像
打开
本身一样,它给了你更多的灵活性。请参阅我上面的编辑,了解更多细节:问题如果你想处理非CSV文件,你需要手动读取,去掉前五行,重新组装,然后将其转储回CSV解析器。您一开始描述的似乎是省略了前五行本来是CSV数据。如果它是CSV文件,可能您没有将其作为正确的字符编码读取。我们无法判断,因为您没有提供有问题的行,但这很容易发生。不,这只是文件顶部的一堆注释,并且给定CSV没有注释行的标准方式,因此必须对其进行预处理会有点麻烦。在第3行中抛出CSV:MalformedCSV错误:非法引用。(这就是我需要在解析CSV之前删除这些行的原因)在第3行中抛出一个CSV:MalformedCSVError:Invalical quoting。(这就是为什么我需要在解析CSV之前删除这些行)