如何从a.csv移除b.csv已存在的记录以生成含11.5k条的c.csv?
当然可以实现这个需求!说白了就是从a.csv里把b.csv已有的记录全部剔除,剩下的就是你要的c.csv,刚好对应20k-8.5k=11.5k条记录。下面给你几个不同场景下的实用方案,按需选就行:
方法一:Python脚本(灵活可控,适合需要定制匹配规则的情况)
如果你懂点Python,这个方法最靠谱,尤其是当你需要按特定字段(比如用户ID、订单号)匹配,而不是整行完全一致的时候。给你个现成的脚本示例:
import csv # 这里假设用第一列作为匹配的唯一标识,要是匹配其他列,改row的索引就行 def get_match_key(row): return row[0] # 先把b.csv里的所有匹配键存到集合里,查起来快 b_records = set() with open('b.csv', 'r', newline='', encoding='utf-8') as b_file: b_reader = csv.reader(b_file) next(b_reader) # 跳过表头,要是没有表头就删掉这行 for row in b_reader: b_records.add(get_match_key(row)) # 遍历a.csv,把不在b里的记录写入c.csv with open('a.csv', 'r', newline='', encoding='utf-8') as a_file, \ open('c.csv', 'w', newline='', encoding='utf-8') as c_file: a_reader = csv.reader(a_file) c_writer = csv.writer(c_file) # 保留表头 header = next(a_reader) c_writer.writerow(header) for row in a_reader: if get_match_key(row) not in b_records: c_writer.writerow(row)
要是你需要整行完全匹配,直接把get_match_key(row)改成tuple(row)就好,非常灵活。
方法二:命令行工具(Linux/macOS专属,快速高效)
如果你平时用命令行,不用写代码,用sort加comm就能搞定:
- 先把两个文件排序(
comm要求输入文件是排序后的):
sort a.csv > a_sorted.csv sort b.csv > b_sorted.csv
- 提取a独有的记录:
comm -23 a_sorted.csv b_sorted.csv > c.csv
解释一下:-23参数的意思是,只保留第一个文件里有、第二个文件里没有的内容,刚好符合你的需求。要是CSV有表头,注意如果b的表头和a一样,可能会被误删,这时候可以先手动把表头复制到c.csv,再处理内容行。
方法三:Excel/Numbers(适合非技术用户,用办公软件搞定)
要是你更习惯用办公软件,也能轻松实现:
- 把a.csv和b.csv分别导入Excel的两个工作表(比如Sheet1放a的内容,Sheet2放b的)。
- 在Sheet1的空白列(比如最后一列)输入公式:
=ISERROR(VLOOKUP(A1, Sheet2!A:A, 1, FALSE)),这里假设A列是用来匹配的唯一列(比如ID),按回车后,显示TRUE就代表这条记录不在b里,FALSE则表示在b里。 - 把公式下拉到所有行,然后筛选出该列为
TRUE的行,复制粘贴到新工作表,最后导出成CSV文件就是c.csv了。
内容的提问来源于stack exchange,提问作者Oluf Nielsen
相关产品推荐
相关产品推荐

