我遇到了一个奇怪的问题,我的脚本无法在某些CSV文件上运行。问题如下,我需要访问列名(文件头)才能正确处理文件。我一直在使用以下(测试)代码来列出标头:
CSV file = CSV.read(argument, :headers => true)
if file.headers() == nil
puts "According to the doc : Headers will not be used"
elsif file.headers() == true
puts "According to the doc : Headers will be used, but not read yet"
else
puts "Headers were read, this is an array : #{file.headers.to_s}"
end
现在,应用于第一个csv:
key,fr
edit,Éditer
close,Fermer
我得到 :
Headers were read, this is an array : ["key", "fr"]
但是,如果我知道在标题和内容本身之间添加一个空行,如下所示:
key,fr
edit,Éditer
close,Fermer
它不再工作了:
Headers were read, this is an array : []
这让我感到困惑。这是预期的行为吗?我能做些什么吗?我一直在阅读 ruby CSV 文档,但找不到任何东西。可能是一些我不知道的csv文件规范吗?在 ruby 1.9.3 和 2.1.1 上测试
> 在读取 CSV 文件时添加选项:skip_blanks => true
。
file = CSV.read(path, :headers => true,:skip_blanks => true)
此选项:skip_blanks => true
,如果有任何像您一样的礼物,将跳过所有此类空白行,您将获得正常输出。
这是我的尝试:
require 'csv'
content = <<_
key,fr
edit,Éditer
close,Fermer
_
File.write('test',content)
file = CSV.read('test', :headers => true,:skip_blanks => true)
if file.headers() == nil
puts "According to the doc : Headers will not be used"
elsif file.headers() == true
puts "According to the doc : Headers will be used, but not read yet"
else
puts "Headers were read, this is an array : #{file.headers.to_s}"
end
# >> Headers were read, this is an array : ["key", "fr"]
正如你所说,工作正常,我也同意你的看法,下面一个:
require 'csv'
content = <<_
key,fr
edit,Éditer
close,Fermer
_
File.write('test',content)
file = CSV.read('test', :headers => true)
file.headers # => ["key", "fr"]
file.to_a # => [["key", "fr"], ["edit", "Éditer"], ["close", "Fermer"]]
当您设置:headers => true
时,CSV数据的第一行将被作为标题。考虑到这个定义,以上内容进展顺利。但下面的一个矛盾:
require 'csv'
File.write('test',content)
file = CSV.read('test', :headers => true)
file.headers # => ["key", "fr"]
file.to_a # => [["key", "fr"], ["edit", "Éditer"], ["close", "Fermer"]]
content = <<_
key,fr
edit,Éditer
close,Fermer
_
File.write('test1',content)
file = CSV.read('test1', :headers => true)
file.headers # => [] # <~~~~~~~~~~~ Is this a bug ?
file.to_a # => [[], [], ["edit", "Éditer"], ["close", "Fermer"]]
file.headers
给出了一个空数组[]
,如你可以看到在file.to_a
输出的第0个索引中也是一个空数组([]
)。但这似乎是一个错误。因此,我提出了这个问题。