MST

星途 面试题库

面试题:Ruby 高效处理大规模 CSV 文件及数据整合

你有两个非常大的 CSV 文件(可能达到数 GB),第一个文件记录了用户的基本信息(user_id, name, email),第二个文件记录了用户的消费记录(user_id, purchase_amount, purchase_date)。请使用 Ruby 编写一个高效的程序,将两个文件的数据进行整合,输出每个用户的总消费金额,并在处理过程中尽量减少内存的使用,同时考虑处理过程中可能出现的各种异常情况。
33.8万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试
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

解释:

  1. 读取用户基本信息:使用 CSV.foreach 逐行读取第一个 CSV 文件,将用户信息存储在 user_info 哈希表中,以 user_id 作为键。
  2. 读取消费记录:同样使用 CSV.foreach 逐行读取第二个 CSV 文件,对于每条消费记录,检查对应的 user_id 是否在 user_info 中存在,如果存在则累加消费金额。
  3. 输出结果:遍历 user_info 哈希表,输出每个用户的总消费金额。
  4. 异常处理
    • Errno::ENOENT 处理文件不存在的情况。
    • CSV::MalformedCSVError 处理 CSV 文件格式错误的情况。
    • StandardError 捕获其他可能的异常。