Ruby操作CSV文件:检查值是否存在并提取对应数组
Ruby解析CSV:检查指定值并提取对应行
需求梳理
你想要实现的功能主要有这几点:
- 让用户输入产品序列号
- 遍历
procedures/Serial.csv文件的每一行,检查输入的序列号是否存在 - 提取所有包含该序列号的行并展示出来
你已编写的部分代码
require 'csv' ######## ## Ask for Serial number ######## serial_number = ask("Product serial number?", true) serial_number = serial_number.to_s serial_number = serial_number.upcase stamp_date= Time.now old = Time.now.to_i ################### ## CHECK if SN exist in Serial List ################### CSV.foreach('procedures/Serial.csv') do |row| check_serial = row[0]
补全后的完整代码
我帮你把代码补全,同时加上注释说明每个步骤的作用:
require 'csv' ######## ## Ask for Serial number ######## # 这里假设你用的是类似Highline库的ask方法来获取用户输入 serial_number = ask("Product serial number?", true) serial_number = serial_number.to_s.strip.upcase # 加上strip去除前后空格,避免匹配失误 stamp_date = Time.now old = Time.now.to_i ################### ## CHECK if SN exist in Serial List & 提取匹配行 ################### matching_rows = [] # 用来存储所有匹配的行 CSV.foreach('procedures/Serial.csv') do |row| check_serial = row[0] # 检查当前行的第一个元素是否和输入的序列号匹配 if check_serial == serial_number matching_rows << row # 匹配成功就把该行存入数组 end end # 展示最终结果 if matching_rows.empty? puts "没有找到包含序列号 #{serial_number} 的记录" else puts "找到 #{matching_rows.size} 条包含序列号 #{serial_number} 的记录:" matching_rows.each_with_index do |row, index| puts "#{index + 1}. #{row.join(', ')}" # 把行数组转成逗号分隔的字符串,更易读 end end
小细节优化说明
- 给
serial_number的处理加上了strip,能去除用户输入时不小心加的前后空格,避免因为无关空格导致匹配失败 - 用
matching_rows数组统一收集匹配行,遍历完整个CSV后再统一输出,比边遍历边输出逻辑更清晰 - 根据匹配结果的数量给出不同提示,用户能直观知道查询结果状态
内容的提问来源于stack exchange,提问作者KTH
相关产品推荐
相关产品推荐

