9

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

当我CSV.table对带有标题行的 CSV 文件运行时,一切都按预期工作。

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

NoMethodError: undefined method `encode' for nil:NilClass

我尝试了不同类型的数据,不同类型的标题,并得到相同的结果。

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

begin
  CSV.table(csv_file_path)
rescue
  # Add error to log or something.
end

有人知道吗?

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

4

1 回答 1

9

没有任何魔法,一般来说它对你不起作用。

正如您从源代码中看到的那样,table实际上只是调用read. headers: true但它也将标头转换为符号 ( header_converters: :symbol),这是它看起来有效的关键。

您会收到没有标题的错误,因为您的第一行数据中有一个空白列(类似于a,b,,d,e)。空白被读取为nil,并且由于nil无法转换为符号,因此它会爆炸。

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

于 2012-10-06T22:16:18.293 回答