使用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
相关产品推荐
相关产品推荐

