Ruby中基于CSV实现汽车数据多条件筛选的代码优化需求
多条件叠加筛选CSV汽车数据的Ruby优化代码
功能说明
支持传入多个筛选条件(如先筛选2门车型,再从中筛选黑色车型),从CSV文件中逐步过滤汽车数据。CSV文件需包含表头(如doors、color等字段)。
实现代码
# 导入Ruby内置的CSV处理库 require 'csv' # 定义多条件筛选方法 # 参数: # - csv_path: CSV文件的路径字符串 # - filters: 筛选条件数组,每个元素为{ attribute: 字段名, value: 目标值 }的哈希 # 返回值:符合所有条件的汽车数据数组(每个元素为包含表头和对应值的哈希) def filter_car_data(csv_path, filters) # 读取CSV文件,将每行转换为以表头为符号键的哈希 car_data = CSV.read(csv_path, headers: true, header_converters: :symbol) # 依次应用每个筛选条件,逐步缩小结果集 filters.each do |filter| attribute = filter[:attribute] target_value = filter[:value] # 过滤出当前字段值匹配目标值的数据 car_data = car_data.select do |car| # 统一转为字符串比较,避免CSV读取值与目标值类型不匹配的问题 car[attribute].to_s == target_value.to_s end # 若当前筛选后无结果,提前终止循环提升效率 break if car_data.empty? end # 返回最终筛选结果 car_data end # ------------------------------ # 示例使用 # ------------------------------ # 定义叠加筛选条件:先选2门车型,再从中选黑色车型 filters = [ { attribute: :doors, value: '2' }, { attribute: :color, value: 'black' } ] # 调用方法获取筛选结果 filtered_cars = filter_car_data('cars.csv', filters) # 输出格式化后的结果 puts "筛选后的汽车数据:" filtered_cars.each do |car| puts car.to_h.inspect end
关键细节说明
- 利用
header_converters: :symbol将CSV表头转为符号,简化哈希键的调用 - 筛选条件以数组形式传入,支持任意数量的叠加规则
- 每次筛选后更新结果集,实现逐步过滤的逻辑
- 添加空结果提前终止机制,避免无意义的后续计算
- 统一字符串类型比较,解决CSV默认读取值为字符串可能导致的类型不匹配问题
内容的提问来源于stack exchange,提问作者burner
相关产品推荐
相关产品推荐

