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

Ruby中将CSV转为哈希并按指定条件(如车门数)分组筛选的实现方法

Ruby处理CSV转哈希并实现筛选功能

核心思路

用Ruby内置的CSV库读取文件,将每行数据转为哈希(表头作为键),再通过交互输入实现指定字段的筛选,同时加入异常处理提升稳定性。

完整代码示例

# 引入Ruby内置CSV处理库,无需额外安装依赖
require 'csv'

# 替换为你的CSV文件实际路径
csv_file = 'cars.csv'

begin
  # 读取CSV文件:headers: true 用第一行表头作为哈希键;converters: :numeric 自动把数字类字段转成数值类型
  csv_data = CSV.read(csv_file, headers: true, converters: :numeric)
  
  # 将CSV库返回的CSV::Row对象转为普通Ruby哈希数组,方便后续操作
  car_hashes = csv_data.map(&:to_h)

  # 引导用户输入筛选条件
  puts "请输入要筛选的字段(可选:make, model, color, doors):"
  target_field = gets.chomp.downcase

  # 校验输入字段是否合法
  unless ['make', 'model', 'color', 'doors'].include?(target_field)
    puts "输入字段无效,请选择指定字段!"
    exit
  end

  puts "请输入要筛选的#{target_field}值:"
  target_value = gets.chomp

  # 针对车门数字段做类型转换,匹配哈希中的数值类型
  target_value = target_value.to_i if target_field == 'doors'

  # 执行筛选:从哈希数组中挑出符合条件的记录
  filtered_results = car_hashes.select { |car| car[target_field] == target_value }

  # 输出结果
  if filtered_results.empty?
    puts "未找到符合条件的车辆记录"
  else
    puts "筛选结果:"
    filtered_results.each_with_index do |car, idx|
      puts "#{idx+1}. 品牌:#{car['make']},型号:#{car['model']},颜色:#{car['color']},车门数:#{car['doors']}"
    end
  end

# 捕获文件不存在的异常
rescue Errno::ENOENT
  puts "错误:找不到文件 #{csv_file},请检查路径是否正确"
# 捕获其他未知异常
rescue => e
  puts "程序出错:#{e.message}"
end

关键细节说明

  • CSV.read的converters: :numeric参数能自动把doors这类数字字段从字符串转为整数,避免后续比较时出现类型不匹配问题
  • 把CSV::Row转成普通哈希后,能直接用哈希键值对的方式操作数据,更符合Ruby常规写法
  • 加入字段合法性校验和异常捕获,避免用户误输入或文件问题导致程序直接崩溃

示例运行效果

当用户输入字段doors、值2时,输出如下:

筛选结果:

  1. 品牌:nissan,型号:350z,颜色:black,车门数:2
  2. 品牌:mazda,型号:miata,颜色:white,车门数:2
  3. 品牌:corvette,型号:stingray,颜色:red,车门数:2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:40:37