Ruby CSV行删除功能优化:输入无效邮箱时提示重新输入
改进Ruby CSV删除功能:添加邮箱有效性循环验证
原始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
原始代码
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] }.to_set delete_car = nil loop do print "\nTo delete a car, enter the email (this is case sensitive): \n> " delete_car = gets.chomp.strip if valid_emails.include?(delete_car) break # 邮箱有效,退出循环 else puts "⚠️ Error: Email not found. Please enter a valid email from the roster." end end # 执行删除操作 table.delete_if { |row| row[:email] == delete_car } File.open("cars.csv", "w") { |f| f.write(table.to_csv) } # 输出更新后的提示 puts "\nUpdated roster after deleting entry for: #{delete_car}" end # 调用方法(如需直接运行可取消注释) # delete_from_data
关键改动说明
- 提前缓存有效邮箱:先加载CSV表格,将所有邮箱存入
Set(比数组查找效率更高),避免重复读取文件 - 循环验证输入逻辑:用
loop do实现循环输入,直到用户输入的邮箱在有效列表中才退出循环 - 明确错误提示:输入无效邮箱时给出清晰提示,引导用户输入正确内容
- 代码结构优化:将验证逻辑与删除逻辑分离,代码可读性更强
内容的提问来源于stack exchange,提问作者burner
相关产品推荐
相关产品推荐

