我一直在用 CSV.table
做一些测试。我有两个几乎相同的小 CSV 文件,但其中一个缺少标题行。
当我对带有标题行的 CSV 文件运行 CSV.table
时,一切都按预期进行。
当我针对没有标题行的 CSV 文件运行它时,我得到:
NoMethodError: undefined method `encode' for nil:NilClass
我用不同类型的数据、不同类型的 header 尝试了这个,并得到了相同的结果。
我很好奇 CSV.table
的魔力。如果我使用 CSV.parse
并将标题设置为 true,那么无论如何它总是使第一行成为标题。所以,我一直在使用 CSV.table
来检查导入的 CSV 文件是否有标题行,但我对此不太满意,因为我不知道它是否或何时会或不会按照我使用的方式工作。
begin
CSV.table(csv_file_path)
rescue
# Add error to log or something.
end
有人知道吗?
附言我已经通读了它以及它在每种方法上提供的源代码 - http://www.ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html
最佳答案
不涉及任何魔法,一般情况下它对您不起作用。
如你所见from the source , table
字面上只是调用 read
和 headers: true
。但它也将 header 转换为符号 (header_converters: :symbol
),这是它看起来有效的关键。
没有标题会出现错误,因为第一行数据中有一个空白列(类似于 a,b,,d,e
)。空白被读入为 nil
,并且由于 nil
无法转换为符号,所以它爆炸了。
尝试使用一些第一行没有空白的数据 - 您会看到 table
会像其他任何方法一样将该行数据视为标题。
关于Ruby 1.9.3 - CSV.table 如何知道 CSV 文件中是否没有 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12713410/