Ruby 3.1.2实现用户输入修改CSV并更新本地文件方案
Ruby CSV文件更新解决方案
问题背景
在Ruby 3.1.2环境下,现有如下CSV文件(cars.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
现有代码可接收用户输入的邮箱,定位对应行修改model字段并在控制台打印修改后的CSV内容,但无法将修改同步到本地的cars.csv文件,同时代码存在冗余,需要优化。
原代码如下:
require "csv" csv = CSV.read('cars.csv', headers: true) print "Enter an email: \n> " demo = gets.chomp #print csv.find {|row| row['email'] == demo} got = csv.find {|row| row['email'] == demo} p got p got.fields p got['model'] got['model'] = 'rcf' p got['model'] p got.fields #prints out the csv file puts csv.to_s
优化后的代码(含文件更新功能)
require "csv" # 读取CSV文件并转换表头为符号 csv_data = CSV.read('cars.csv', headers: true, header_converters: :symbol) # 获取并处理用户输入 print "输入要修改的邮箱:\n> " target_email = gets.chomp.strip # 定位目标行并执行修改 target_row = csv_data.find { |row| row[:email] == target_email } if target_row print "输入新的model值:\n> " new_model = gets.chomp.strip target_row[:model] = new_model puts "已找到对应行并完成修改" else puts "未找到邮箱为#{target_email}的记录" exit 1 end # 将修改后的数据写入原文件 CSV.open('cars.csv', 'w', headers: csv_data.headers, write_headers: true) do |csv| csv_data.each { |row| csv << row } end # 打印修改后的内容 puts "\n修改后的CSV内容:" csv_data.each { |row| puts row.to_csv.chomp }
关键优化说明
- 文件写入实现:用
CSV.open以写入模式('w')打开文件,指定表头参数确保保留原结构,遍历修改后的数据逐行写入,完成本地文件更新。 - 错误处理:增加未找到目标邮箱时的提示并退出,避免空指针报错。
- 代码精简:移除原代码中冗余的调试输出,保留必要的交互提示。
- 表头转换:通过
header_converters: :symbol将表头转为符号,用row[:email]代替字符串访问字段,代码更简洁。 - 输入优化:用
strip处理用户输入,去除首尾空白,避免因输入空格导致匹配失败。 - 交互灵活性:新增用户自定义
model值的输入步骤,不再固定修改为rcf。
内容的提问来源于stack exchange,提问作者burner
相关产品推荐
相关产品推荐

