Ruby 1.9.3 - 如果CSV文件中没有标题,CSV.table如何知道?

Mat*_*ire 9 ruby csv

我一直在做一些测试CSV.table.我有两个小而几乎相同的CSV文件,但是有一个缺少标题行.

当我CSV.table使用标题行运行CSV文件时,一切都按预期工作.

当我在没有标题行的CSV文件中运行它时,我得到:

NoMethodError: undefined method `encode' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

我尝试使用不同类型的数据,使用不同类型的标题,并获得相同的结果.

我很好奇CSV.table.如果我使用CSV.parse标头设置为true,那么它总是使第一行成为标题,无论如何.所以,我一直在CSV.table用来检查导入的CSV文件是否有标题行,但我对此不太满意,因为我不明白它是否或何时会以我正在使用它的方式工作.

begin
  CSV.table(csv_file_path)
rescue
  # Add error to log or something.
end
Run Code Online (Sandbox Code Playgroud)

有人知道吗?

PS我已经阅读了它以及它为每种方法提供的源代码 - http://www.ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html

And*_*nes 9

没有任何魔法,一般来说它不适合你.

正如你可以看到从源头上,table从字面上只是调用readheaders: true.但它也将标题转换为符号(header_converters: :symbol),这是它似乎工作的关键.

没有标题会出现错误,因为第一行数据中有一个空白列(类似于a,b,,d,e).空白被读入nil,因为nil无法转换为符号,它会爆炸.

尝试使用第一行中没有空白的一些数据 - 您将看到table将该行数据视为标题,就像任何其他方法一样.