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

Ruby读取CSV转哈希获取model字段报错,如何输出所有车型?

CSV转哈希提取唯一Model值的代码修正

问题详情

用户的CSV数据如下:

make,model,color,doors,email
dodge,charger,black,4,practice1@whatever.com
ford,focus,blue,5,practice2@whatever.com
nissan,350z,black,2,practice3@whatever.com
mazda,miata,white,2,practice4@whatever.com
honda,civid,brown,4,practice5@whatever.com
corvette,stingray,red,2,practice6@whatever.com
ford,fiesta,blue,5,practice7@whatever.com
bmw,m4,black,2,practice8@whatever.com
audi,a5,blue,2,practice9@whatever.com
subaru,brz,black,2,practice10@whatever.com
lexus,rc,black,2,practice11@whatever.com

运行Ruby代码时触发报错:

data [:model]
^^^^

原代码(意图是将CSV转为哈希后输出所有不同的model值):

require "csv"

CSV.foreach("cars.csv", headers: true) do |row|
    data = puts row.to_h
end

data [:model]
puts data

问题排查

原代码存在三个核心问题:

  1. 变量作用域错误:data定义在CSV.foreach的块内部,块外部无法访问这个变量,导致后续调用data[:model]直接报错。
  2. 赋值逻辑错误:data = puts row.to_h中,puts方法的返回值是nil,所以data被赋值为空,根本无法存储行哈希数据。
  3. 需求逻辑缺失:没有实现收集所有model值并去重的逻辑,原代码仅尝试获取单个model,完全不符合需求。

修正后的代码

方法一:用Set逐步收集去重

require "csv"
require "set" # 引入Set库

# 初始化Set自动去重
unique_models = Set.new

CSV.foreach("cars.csv", headers: true) do |row|
    # 提取当前行的model值加入集合
    unique_models.add(row["model"])
end

# 输出所有唯一model值
puts unique_models.to_a

方法二:简洁写法(一次性读取+去重)

require "csv"

# 读取所有行→提取model字段→去重
unique_models = CSV.read("cars.csv", headers: true).map { |row| row["model"] }.uniq

puts unique_models

补充说明

  • 无需强制把行转成哈希,直接通过row["model"]就能获取对应字段值,转哈希的话用row.to_h["model"]也可以。
  • Set适合处理大数据量的逐步去重,uniq方法则更简洁直观,小数据量下优先选择。

内容的提问来源于stack exchange,提问作者burner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:15:36