基于CSV重复列替换主文件指定列值并保留原有顺序
保留原顺序的CSV批量更新方案
需求说明
- 两个两列CSV文件:
- File A:主文件,必须严格保留原有条目顺序
- File B:仅包含部分需要更新的条目(Column1为匹配键,Column2为新值)
- 执行规则:仅当两文件Column1的值重复时,用File B的Column2替换File A的Column2,其余条目保留原内容和顺序
示例
File A
| Name | Number |
|---|---|
| Bob Smith | 12 |
| Mary West | 67 |
| Joe Soap | 77 |
| Edith Little | 41 |
File B
| Name | Number |
|---|---|
| Mary West | 83 |
| Edith Little | 16 |
期望结果
| Name | Number |
|---|---|
| Bob Smith | 12 |
| Mary West | 83 |
| Joe Soap | 77 |
| Edith Little | 16 |
可行解决方案
方案1:Google Sheets(可视化操作)
之前的去重替换会丢失顺序,改用VLOOKUP公式可完美保留原顺序:
- 将File A导入Sheet1,File B导入Sheet2
- 在Sheet1的C2单元格输入公式:
=IFERROR(VLOOKUP(A2, Sheet2!A:B, 2, FALSE), B2)- 逻辑:如果当前Name在Sheet2中存在,返回对应的新Number;否则保留原Number
- 下拉填充整个C列,此时C列就是更新后的数值列
- 选中C列,右键选择「粘贴为值」覆盖到B列,删除C列后导出为CSV即可
方案2:Python脚本(批量自动化)
适合需要重复处理或大文件的场景,完全可控:
import csv # 先读取File B,构建Name到Number的映射字典 update_mapping = {} with open('file_b.csv', 'r', newline='', encoding='utf-8') as file_b: reader = csv.DictReader(file_b) for row in reader: update_mapping[row['Name']] = row['Number'] # 遍历File A,保留原顺序并更新匹配条目 with open('file_a.csv', 'r', newline='', encoding='utf-8') as file_a, \ open('updated_file_a.csv', 'w', newline='', encoding='utf-8') as output_file: reader = csv.DictReader(file_a) writer = csv.DictWriter(output_file, fieldnames=reader.fieldnames) writer.writeheader() for row in reader: if row['Name'] in update_mapping: row['Number'] = update_mapping[row['Name']] writer.writerow(row)
运行脚本后会生成updated_file_a.csv,完全保留File A的原始顺序。
方案3:Awk命令行(快速处理)
适合熟悉命令行的用户,无需额外工具:
awk -F ',' 'NR==FNR {map[$1]=$2; next} {if ($1 in map) $2=map[$1]; print}' file_b.csv file_a.csv > updated_file_a.csv
- 逻辑:先读取File B构建映射表,再遍历File A替换匹配的第二列,输出到新文件,原顺序丝毫不改
内容的提问来源于stack exchange,提问作者JohnGB
相关产品推荐
相关产品推荐

