CSV ::行和哈希导航不工作Ruby 2.3.3 Rails 5.1

问题描述 投票:0回答:2

我使用CSV.parse解析了一个csv并逐行导航。所以我们看到的对象是一个名为CSV::Rowrow

这是当我尝试导航row时发生的情况的屏幕截图:screenshot

正如你所看到的,我可以打电话给.headers(),你可以期待Strain在列表中

当你看到对象本身时,你可以看到"Strain":"818 Headband"

所以row['Strain']应该等于8181 Headband,除了它返回nil

当然,我尝试过row.Strainrow["Strain"]row[Strain]row[:Strain],但都没有奏效。

我还认为它可能包含在一个单项数组中,所以我尝试了row[0]['Strain'],并且还返回了nil,毫不奇怪。

假设问题出在CSV::Row对象上,我调用row_hash = row.to_hash()将对象作为哈希。

现在我们处于基本的红宝石当然正常的电话如row_hash['Strain']会正常工作吗?!?不。还是nila view of row_hash

我很困惑,这根本不是复杂的代码。 HashCSV::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”的字符串?!?

ruby-on-rails ruby csv parsing hash
2个回答
1
投票

简单的莱姆指出了正确的方法!谢谢!

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


1
投票

您可以使用gsub方法删除额外的不可见字符

gsub("\xEF\xBB\xBF","")
© www.soinside.com 2019 - 2024. All rights reserved.