面试题答案
一键面试require 'csv'
user_info = {}
begin
CSV.foreach('user_info.csv', headers: true) do |row|
user_id = row['user_id']
user_info[user_id] ||= { name: row['name'], email: row['email'], total_amount: 0 }
end
CSV.foreach('purchase_records.csv', headers: true) do |row|
user_id = row['user_id']
if user_info.key?(user_id)
user_info[user_id][:total_amount] += row['purchase_amount'].to_f
end
end
user_info.each do |user_id, info|
puts "User ID: #{user_id}, Name: #{info[:name]}, Email: #{info[:email]}, Total Amount: #{info[:total_amount]}"
end
rescue Errno::ENOENT => e
puts "文件不存在: #{e.message}"
rescue CSV::MalformedCSVError => e
puts "CSV 格式错误: #{e.message}"
rescue StandardError => e
puts "发生错误: #{e.message}"
end
解释:
- 读取用户基本信息:使用
CSV.foreach
逐行读取第一个 CSV 文件,将用户信息存储在user_info
哈希表中,以user_id
作为键。 - 读取消费记录:同样使用
CSV.foreach
逐行读取第二个 CSV 文件,对于每条消费记录,检查对应的user_id
是否在user_info
中存在,如果存在则累加消费金额。 - 输出结果:遍历
user_info
哈希表,输出每个用户的总消费金额。 - 异常处理:
Errno::ENOENT
处理文件不存在的情况。CSV::MalformedCSVError
处理 CSV 文件格式错误的情况。StandardError
捕获其他可能的异常。