使用Ruby合并两个数据不同的CSV并替换对应邮箱
解决思路与Ruby实现方案
嘿,这个需求本质就是建立姓名到邮箱的映射,再批量替换目标CSV的邮箱字段,刚好你熟悉Ruby的CSV操作,那咱们直接上干货:
核心步骤
- 先从
google.csv中提取「姓名-邮箱」的对应关系,这里要重点处理大小写不匹配的问题(毕竟你的示例里asm是全大写,google是正常大小写) - 遍历
asm.csv的每一行,用姓名去映射表中查找对应的google邮箱,找到就替换,找不到则保留原邮箱 - 将处理后的结果写入新的CSV文件
完整代码实现
require 'csv' # 1. 构建Google CSV的姓名-邮箱映射表(统一转小写避免大小写匹配问题) google_email_map = {} CSV.foreach('google.csv', headers: true) do |row| # 拼接全名并转小写,作为映射的key full_name_key = "#{row['First_name'].downcase} #{row['Last_name'].downcase}" # 存储对应的Google邮箱 google_email_map[full_name_key] = row['Email_address'] end # 2. 处理ASM CSV并生成更新后的文件 CSV.open('updated_asm.csv', 'w', write_headers: true, headers: ['first_name', 'last_name', 'email_address']) do |output_csv| CSV.foreach('asm.csv', headers: true) do |input_row| # 同样转小写生成匹配key full_name_key = "#{input_row['first_name'].downcase} #{input_row['last_name'].downcase}" # 优先使用Google的邮箱,找不到则保留原邮箱 updated_email = google_email_map[full_name_key] || input_row['email_address'] # 写入新行(保留原姓名的大小写格式) output_csv << [input_row['first_name'], input_row['last_name'], updated_email] end end
注意事项
- 路径问题:确保
google.csv和asm.csv与你的Ruby脚本在同一目录,或者使用绝对路径(比如'/Users/xxx/Documents/google.csv') - 重名处理:如果
google.csv中有多个相同姓名的用户,后面的条目会覆盖前面的邮箱。如果需要处理重名场景,可以考虑把映射值改成数组,再根据额外逻辑选择邮箱 - 测试建议:先拿一小部分样本数据测试脚本,确认替换逻辑正确后再处理全量数据
内容的提问来源于stack exchange,提问作者Trenton T
相关产品推荐
相关产品推荐

