Ian*_*oks 5 ruby csv hash parsing ruby-on-rails
我已经使用解析了 csv CSV.parse,并逐行导航它。所以我们正在查看的对象是一个CSV::Row被称为row
这是我尝试导航时发生的情况的屏幕截图row:
屏幕截图
正如你所看到的,我可以打电话.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()该对象以哈希形式获取。
现在我们已经在基本的 ruby 中了,当然像这样的普通调用也row_hash['Strain']可以工作吧?!?没有。仍然nil。
row_hash 的视图
我很困惑,这根本不是复杂的代码。Hash和的文档CSV::Row都列为[]一种方法,我在谷歌上搜索到的所有文章都列为row['key']正确的格式......但它对我不起作用。
请帮忙,我有一系列这样的 csv,我需要用它们来种子数据库,如果我无法导航哈希,我就无法做到这一点!
2018 年 5 月 15 日中午 12:51 编辑:
csv.each do |row|
row.each do |key, value|
binding.pry
end
end
$ key
=> "Strain"
$ value
=> "818 Headband"
$ row["Strain"]
=> nil
Run Code Online (Sandbox Code Playgroud)
这不可能是对的...
2018 年 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"
Run Code Online (Sandbox Code Playgroud)
值为“Strain”的字符串为何csv.headers.first不等于值为“Strain”的字符串?!?
简单的石灰给我指明了正确的方向!谢谢你!
问题在于,当标题作为字符串打印时,存在一些隐藏字符不会被渲染。这就是为什么csv.first[csv.headers.first]有效但csv.first["Strain"]无效的原因,即使csv.headers.firstreturn "Strain"。据推测,它真正返回的是类似的东西"invisiblestuffStrain"(夸张,但你明白了)。
要检查并查看您是否属于这种情况,请调用.bytes标头上的方法,然后.bytes再次调用您期望的字符串值,例如"Strain".bytes。如果有什么不同,那就是你有隐藏的字符。
这是我的实际控制台输出:
$ csv.headers.first.bytes
=> [239, 187, 191, 83, 116, 114, 97, 105, 110]
$ "Strain".bytes
=> [83, 116, 114, 97, 105, 110]
Run Code Online (Sandbox Code Playgroud)
您可以看到为该对象存储了 3 个额外字符,这些字符在呈现为字符串时不会显示。
Simple Lime 说:“您需要将gsub它们删除或删除原始 csv 中的文本,然后手动重新输入,以确保没有添加任何额外内容”
对我来说,我必须.csv直接从文本编辑器修改,而不是使用 Excel 并将其另存为.csv.
编辑:我发现从.xlsxMS Excel 中的工作簿保存到 是.csv导致出现这些奇怪字符的原因。我必须编辑该文件,因此我重新打开并重新保存,并在重新播种时再次出现相同的错误。就像以前一样,从文本编辑器中重新键入第一个标题解决了该问题。
| 归档时间: |
|
| 查看次数: |
1421 次 |
| 最近记录: |