You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Ruby按唯一ID合并CSV文件:无匹配项留空

Ruby实现CSV合并方案(替代Excel VLOOKUP)

这里有个用Ruby标准库CSV实现的方案,完全能满足你的需求——把两个CSV按username关联,没有匹配的字段自动留空,还能自动化处理,比手动用Excel方便多了:

核心思路

  • 先把file2.csv的数据以username为键存入哈希,后续查找匹配项会非常高效
  • 遍历file1.csv的每一行,根据username去哈希里找对应记录
  • 合并两行数据:找到匹配就补上file2的字段,没找到就给file2对应字段填空字符串
  • 把合并后的结果写入output.csv

完整代码

require 'csv'

# 第一步:读取file2.csv,构建username到对应字段的哈希
file2_data = {}
CSV.foreach('file2.csv', col_sep: ';', headers: true) do |row|
  username = row['username']
  # 只保留file2中除了username之外的字段
  file2_fields = row.to_h.except('username')
  file2_data[username] = file2_fields
end

# 确定输出的表头:file1的表头 + file2中除username外的表头
file1_headers = CSV.open('file1.csv', col_sep: ';', headers: true).headers
file2_headers = CSV.open('file2.csv', col_sep: ';', headers: true).headers - ['username']
output_headers = file1_headers + file2_headers

# 第二步:处理file1并写入output.csv
CSV.open('output.csv', 'w', col_sep: ';', write_headers: true, headers: output_headers) do |output_csv|
  CSV.foreach('file1.csv', col_sep: ';', headers: true) do |file1_row|
    username = file1_row['username']
    # 获取匹配的file2字段,没有匹配就用空字符串填充所有file2字段
    matched_file2_fields = file2_data.fetch(username, file2_headers.to_h { |h| [h, ''] })
    # 合并file1行数据和匹配到的file2字段
    merged_row = file1_row.to_h.merge(matched_file2_fields)
    # 按输出表头的顺序把值整理成数组写入
    output_csv << output_headers.map { |header| merged_row[header] }
  end
end

关键细节说明

  • 分隔符处理:代码里指定了col_sep: ';',因为你的CSV用分号分隔,Ruby默认是逗号,这一步必须加,否则会解析错误
  • 空值处理:用file2_data.fetch(username, file2_headers.to_h { |h| [h, ''] })确保没有匹配时,file2的所有字段都填充空字符串,完全符合你的要求
  • 表头顺序:输出表头严格保留file1的原始顺序,再追加file2的字段(除了重复的username),和你手动用VLOOKUP的结果逻辑一致

运行这段代码前,确保file1.csv和file2.csv和脚本在同一个目录下,直接执行脚本就能生成output.csv啦。

内容的提问来源于stack exchange,提问作者Arnaud Jeannin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:10:32