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时,输出如下:
筛选结果:
- 品牌:nissan,型号:350z,颜色:black,车门数:2
- 品牌:mazda,型号:miata,颜色:white,车门数:2
- 品牌:corvette,型号:stingray,颜色:red,车门数:2
内容的提问来源于stack exchange,提问作者burner
相关产品推荐
相关产品推荐

