无法将csv数据放在哈希中

时间:2016-12-27 12:10:22

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个包含两列的CSV文件:

CSV.foreach("filename.CSV", headers: true) do |row|
  file_details << row.inspect # hash
end

我从这个文件读取数据并使用以下代码插入数组:

file_details

然后我尝试将PPS_Id中的数据推送到一个哈希,其中Amount为关键字,file_details_hash = Hash.new file_details.each { |x| file_details_hash[x['PPS_Id']] = x['Amount'] } 为值,我使用的代码如下:

{"PPS_Id"=>"Amount"}

但是当我打印结果时,我得到的只是{{1}}

你能帮忙吗

3 个答案:

答案 0 :(得分:1)

首先,您将字符串收集到一个数组中(参见String#inspect):

file_details << row.inspect

之后你在那个字符串上打电话给(sic!)String#[]

x['PPS_Id'] #⇒ "PPS_Id", because string contains this substring

那就是说,你的代码只有错误。你可以实现你想要的目标:

csv = CSV.parse(File.read("filename.CSV"), col_sep: "\s")
csv[1..-1].to_h
#⇒ {
#    "123" => "100",
#   "1234" => "150"
# }

答案 1 :(得分:1)

使用inspect会将您的CSV行保存为字符串,因此很明显您无法获得所需内容。相反,试试这个:

file_details = CSV.read("filename.csv")

直接读取CSV将创建一个可以迭代的2D数组,如下所示:[["PPS_Id", "Amount"], ["123", "100"], ["1234", "150"]]

从那里你可以略微修改你的方法:

file_details.each do |key, value|
  file_details_hash[key] = value
end

要接收这样的哈希:{"PPS_Id"=>"Amount", "123"=>"100", "1234"=>"150"}

答案 2 :(得分:1)

您的代码已修改为

您需要为csv指定列分隔符,然后删除inspect

require 'csv'

file_details = []
CSV.foreach("filename.CSV", headers: true, col_sep: "\s" ) do |row|
  file_details << row
end

file_details_hash = Hash.new
file_details.each { |x|
  file_details_hash[x['PPS_Id']] = x['Amount']
}

p file_details_hash
#=> {"123"=>"100", "1234"=>"150"}

它现在可以返回您期望获得的内容。

更短的解决方案

阅读csv,删除第一行(标题)并转换为Hash:

p CSV.read("filename.CSV", col_sep: "\s").drop(1).to_h
#=> {"123"=>"100", "1234"=>"150"}