我有一个包含两列的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}}
你能帮忙吗
答案 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"}