【发布时间】:2018-10-24 08:48:24
【问题描述】:
我已经使用 CSV.parse 解析了一个 csv,并且正在逐行导航它。所以我们正在查看的对象是一个名为row 的CSV::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() 来获取该对象作为哈希值。
既然我们在基本的 ruby 中,当然像 row_hash['Strain'] 这样的普通调用会正常工作吗?!?没有。还是nil。
a view of row_hash
我很困惑,这根本不是复杂的代码。 Hash 和CSV::Row 的文档都将[] 列为一种方法,而我在谷歌上搜索的所有文章都将row['key'] 列为正确的格式……除非它对我不起作用。
请帮忙,我有一系列这些 csv,我需要用这些 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
这不可能……
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"
csv.headers.first 是一个值为“Strain”的字符串,但它不等于一个值为“Strain”的字符串?!?
【问题讨论】:
-
row.has_key?("Strain")的输出是什么。另外,您是否尝试过使用each遍历该行,并且您可以打印出该行中每个元素的键值吗?看起来您的代码应该可以工作。您是否尝试过在没有 Rails 的常规 IRB 会话中解析 CSV?您的环境中可能有一些东西导致了奇怪 -
row[row.headers.first]返回正确的结果吗?row.headers.first.bytes看起来像什么? (也请将代码添加为文本(使用代码格式化按钮)而不是图像) -
Leo -
row.has_key?("Strain")返回false我很惊讶,我们可以将“应变”视为选项之一。我还没有尝试过对每个行进行迭代,我现在就试试。我也没有尝试过普通的 IRB,所以我也可以试试。 Lime -row[row.headers.first]返回"818 Headband"令人惊讶,因为row.headers.first返回"Strain"但row["Strain"]仍然返回nil。 -
@IanBrooks
rows.headers.first.bytes或rows.headers.first.codepoints怎么样?这些会告诉你标题中是否有任何隐藏/不可见的字符。如果有,您需要gsub删除它们或删除原始 csv 中的文本并手动重新输入以确保没有添加任何额外内容
标签: ruby-on-rails ruby csv parsing hash