我使用CSV.parse
解析了一个csv并逐行导航。所以我们看到的对象是一个名为CSV::Row
的row
这是当我尝试导航row
时发生的情况的屏幕截图:screenshot
正如你所看到的,我可以打电话给.headers()
,你可以期待Strain
在列表中
当你看到对象本身时,你可以看到"Strain":"818 Headband"
所以row['Strain']
应该等于8181 Headband
,除了它返回nil
当然,我尝试过row.Strain
,row["Strain"]
,row[Strain]
,row[:Strain]
,但都没有奏效。
我还认为它可能包含在一个单项数组中,所以我尝试了row[0]['Strain']
,并且还返回了nil
,毫不奇怪。
假设问题出在CSV::Row
对象上,我调用row_hash = row.to_hash()
将对象作为哈希。
现在我们处于基本的红宝石当然正常的电话如row_hash['Strain']
会正常工作吗?!?不。还是nil
。 a view of row_hash
我很困惑,这根本不是复杂的代码。 Hash
和CSV::Row
的文档都列出了[]
作为一种方法,我用Google搜索的所有文章都将row['key']
列为正确的格式......除了它对我不起作用。
请帮助,我有一系列这些csvs,我需要种子数据库,如果我无法导航哈希,我不能这样做!
编辑15/15/18下午12:51:
csv.each do |row|
row.each do |key, value|
binding.pry
end
end
$ key
=> "Strain"
$ value
=> "818 Headband"
$ row["Strain"]
=> nil
这可能不对......
编辑于5月15日下午1:05:
$ = irb(main)
$ csv_text = File.read('strain_data_formatted.csv')
=> ... (it dumped the whole csv to console)
$ csv = CSV.parse(csv_text, :headers => true, :encoding => 'ISO-8859-1')
=> #<CSV::Table mode:col_or_row row_count:118>
$ csv.first
=> #<CSV::Row "Strain":"818 Headband" "Subspecies":nil "Heritage":nil...
$ csv.first["Strain"]
=> nil
$ csv.headers.first
=> "Strain"
$ csv.first[csv.headers.first]
=> "818 Headband"
$ csv.headers.first.class
=> String
$ "Strain".class
=> String
$ csv.headers.first == "Strain"
=> false
$ csv.headers.first
=> "Strain"
csv.headers.first
是一个值为“Strain”的字符串,但它不等于值为“Strain”的字符串?!?
简单的莱姆指出了正确的方法!谢谢!
问题是当标题作为字符串打印时,有些隐藏字符无法呈现。这就是为什么csv.first[csv.headers.first]
工作,但csv.first["Strain"]
没有,即使csv.headers.first
返回"Strain"
。据推测它真正回归的是像"invisiblestuffStrain"
(夸张但你明白了)。
要检查并查看是否属于这种情况,请在标题上调用.bytes
方法,然后再次调用.bytes
对您期望的字符串值eg"Strain".bytes
。如果有任何差异,您有隐藏的字符。
这是我的实际控制台输出:
$ csv.headers.first.bytes
=> [239, 187, 191, 83, 116, 114, 97, 105, 110]
$ "Strain".bytes
=> [83, 116, 114, 97, 105, 110]
您可以看到为该对象存储的3个额外字符在呈现为字符串时不会显示。
Simple Lime说:“你需要gsub
出来或删除原始csv中的文本,并手动重新键入,以确保没有额外的东西添加”
对我来说,我必须直接从我的文本编辑器修改.csv
,使用excel并将其保存为.csv
。
编辑:我发现从MS Excel中的.xlsx
工作簿保存到.csv
是导致这些奇怪字符出现的原因。我必须编辑文件,以便重新打开并重新保存,并在重新播种时再次出现相同的错误。和以前一样,从文本编辑器重新键入第一个标题可以解决问题。
您可以使用gsub方法删除额外的不可见字符
gsub("\xEF\xBB\xBF","")