Ruby遍历子数组创建键值对时哈希数据丢失问题排查
Ruby解析TSV时哈希仅保留最后一条记录的问题解决
问题原因
哈希的键具有唯一性,当你遍历TSV记录时,每次遇到相同的shop(键),新的price值会直接覆盖之前存储的值,所以最终每个shop只会保留最后一次赋值的price。
修正方案(保留所有price记录)
如果需要保留每个shop的所有price,应该把哈希的值设为数组,每次遍历到对应shop时,将price追加到数组中:
require 'csv' # 创建默认值为空数组的哈希,避免键不存在时的报错 shop_prices = Hash.new { |h, k| h[k] = [] } CSV.foreach('your_file.tsv', col_sep: "\t") do |row| next if row[0] == 'header' # 跳过表头(如果文件有表头的话) price = row[1].to_f # 将第二列的price转为数值类型 shop = row[-1] # 取最后一列作为shop键 shop_prices[shop] << price # 把当前price追加到对应shop的数组中 end # 打印每个shop的所有price记录 shop_prices.each do |shop, prices| puts "#{shop}: #{prices.join(', ')}" end
扩展:计算每个shop的总价
基于上述逻辑,只需将哈希的默认值设为0,直接累加每个shop的price即可:
require 'csv' # 创建默认值为0的哈希,方便直接累加总价 shop_total = Hash.new(0) CSV.foreach('your_file.tsv', col_sep: "\t") do |row| next if row[0] == 'header' price = row[1].to_f shop = row[-1] shop_total[shop] += price # 累加当前price到对应shop的总价中 end # 打印每个shop的最终总价 shop_total.each do |shop, total| puts "#{shop}: 总价 #{'%.2f' % total}" end
内容的提问来源于stack exchange,提问作者green_ruby
相关产品推荐
相关产品推荐

