Ruby 3.1.2中CSV文件行删除的邮箱校验功能实现问题
需求与问题
需要在Ruby 3.1.2环境下处理车辆信息CSV文件,实现以下逻辑:
- 用户输入邮箱时,若输入的不是CSV中存在的有效邮箱,需提示重新输入直到正确
- 输入正确邮箱后,删除对应行并更新CSV
现有代码可实现行删除,但缺少邮箱有效性校验环节,导致无效邮箱输入仍会执行后续操作。
车辆信息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
现有代码(缺少校验)
def delete_from_data print "\nTo delete a car, enter the email (this is case sensitive): \n> " delete_car = gets.chomp #this allows me to delete a certain row based on email table = CSV.table("cars.csv") table.delete_if do |row| row[:email] == delete_car end File.open("cars.csv", "w") do |f| f.write(table.to_csv) end #this shows the updated student roster after deleting user puts "\nThis is the updated roster after deleting: #{delete_car}" end
补充校验后的完整代码
require 'csv' def delete_from_data # 读取CSV并提取所有有效邮箱 table = CSV.table("cars.csv") valid_emails = table.map { |row| row[:email] } # 循环获取输入,直到用户输入有效邮箱 loop do print "\nTo delete a car, enter the email (this is case sensitive): \n> " delete_car = gets.chomp if valid_emails.include?(delete_car) # 邮箱有效,执行删除操作 table.delete_if { |row| row[:email] == delete_car } File.open("cars.csv", "w") { |f| f.write(table.to_csv) } puts "\nThis is the updated roster after deleting: #{delete_car}" break # 退出循环 else # 邮箱无效,提示重新输入 puts "Error: Email not found. Please enter a valid email from the list." end end end
核心修改点
- 提前读取CSV并提取所有
valid_emails,用于后续合法性校验 - 使用
loop循环实现重复输入提示,直到用户输入有效邮箱 - 通过
valid_emails.include?(delete_car)判断输入是否合法,仅合法时才执行删除和文件更新操作 - 无效输入时给出明确提示,引导用户重新输入
内容的提问来源于stack exchange,提问作者burner
相关产品推荐
相关产品推荐

