CSV::Row 和 Hash 导航不起作用 Ruby 2.3.3 Rails 5.1

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']可以工作吧?!?没有。仍然nilrow_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”的字符串?!?

Ian*_*oks 5

简单的石灰给我指明了正确的方向!谢谢你!

问题在于,当标题作为字符串打印时,存在一些隐藏字符不会被渲染。这就是为什么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导致出现这些奇怪字符的原因。我必须编辑该文件,因此我重新打开并重新保存,并在重新播种时再次出现相同的错误。就像以前一样,从文本编辑器中重新键入第一个标题解决了该问题。