You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何比较两个CSV文件并获取差异?基于前两行去重遇报错

解决两个CSV文件基于前两列去重求差异的问题

嘿,我来帮你搞定这个CSV对比的需求!你想要基于每行的前两个字段判断,移除两个文件里都存在的对应行,最终得到两者的差异对吧?下面给你两种实用的方案,不管你习惯写代码还是用命令行都能解决:

方法一:用Python Pandas(灵活可控,适合复杂场景)

如果你熟悉Python,用Pandas处理CSV会非常顺手,步骤如下:

首先确保你已经安装了Pandas:

pip install pandas

然后运行这段代码(可以根据你的CSV结构调整细节):

import pandas as pd

# 读取两个CSV文件(如果你的文件有特殊分隔符,比如制表符,要加sep='\t')
df_a1 = pd.read_csv('a1.csv')
df_a2 = pd.read_csv('a2.csv')

# 获取两个文件中前两列完全相同的行的"标识"
common_rows = pd.merge(df_a1.iloc[:, :2], df_a2.iloc[:, :2], how='inner')

# 从a1中移除那些前两列在交集中的行
a1_unique = df_a1[~df_a1.apply(lambda row: (row.iloc[0], row.iloc[1]) in common_rows.itertuples(index=False), axis=1)]
# 从a2中移除同样的行
a2_unique = df_a2[~df_a2.apply(lambda row: (row.iloc[0], row.iloc[1]) in common_rows.itertuples(index=False), axis=1)]

# 合并两个文件的独有行,得到最终差异
final_diff = pd.concat([a1_unique, a2_unique])

# 把结果保存到新CSV文件
final_diff.to_csv('csv_diff_result.csv', index=False)

小提示:

  • 如果你的CSV有明确的列名,你可以把iloc[:, :2]换成具体的列名列表,比如['user_id', 'order_no'],这样代码可读性更强。
  • 如果运行时报错,先检查文件路径是否正确,或者CSV的分隔符是否和代码里的一致(默认是逗号)。

方法二:用命令行工具(快速高效,不用写代码)

如果你不想写代码,用Linux/macOS的命令行工具就能快速搞定,假设你的CSV用逗号分隔:

# 提取前两列+整行,排序后保留只出现一次的行,最后还原原行内容
awk '{print $1","$2","$0}' a1.csv a2.csv | sort | uniq -u | awk -F ',' '{print substr($0, length($1)+length($2)+3)}' > csv_diff_result.csv

解释:

  1. 第一个awk把每行的前两列和整行拼接,方便后续基于前两列判断重复;
  2. sort把所有行排序,让重复的行挨在一起;
  3. uniq -u只保留只出现过一次的行(也就是只在a1或只在a2中存在的行);
  4. 第二个awk去掉前面拼接的前两列前缀,还原成原来的行内容,最后保存到结果文件。

如果你的CSV用的是其他分隔符(比如制表符),把命令里的","换成"\t"就行。

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

火山引擎 最新活动