You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 13:32:07