CSV差异比较

比较两个CSV文件,即时查看新增的行、删除的行以及发生变化的单元格。可指定任意列作为行的识别键进行匹配,并列显示变更前后的值,即使两个CSV的列结构不同也能比较。所有处理均在浏览器内完成。

什么是CSV差异比较

CSV差异比较是一款按列和按行对两份CSV(或TSV)数据进行比对,自动找出"新增的行""删除的行"以及"值发生变化的单元格"的工具。文本编辑器的按行比较(例如Git的diff)通常只能判断整行是新增还是删除,而本工具会先根据识别键(相当于ID或主键的列)将两边的行一一对应,再逐列进行比较,因此能够精确定位到"同一行中究竟是哪一列的值变了"。

输入的CSV数据仅在浏览器内通过JavaScript处理,不会发送到任何服务器。因此,即使是会员信息、销售数据等不便对外公开的内容,也可以放心比较。此外,即便两份CSV的列顺序或列数不同,本工具也会以表头名称为基准自动对应后再进行比较,无需事先手动调整两份数据的列结构。

CSV差异比较的使用方法

  1. 准备比较源(A)和比较目标(B)的CSV 将更新前的CSV粘贴到左侧输入框,更新后的CSV粘贴到右侧输入框,也可以通过"选择文件"上传CSV或TSV文件。
  2. 选择分隔符 根据数据是逗号分隔的CSV还是制表符分隔的TSV,将"分隔符"设置为"逗号"或"制表符"。
  3. 指定是否包含表头行 如果第一行是列名表头,请勾选"将首行作为表头";若没有表头,取消勾选后系统会自动分配col1、col2等序号列名。
  4. 选择键列 从下拉菜单中选择用于识别行的列(相当于ID或主键的列),A和B两边的行将根据该列的值进行对应匹配。
  5. 查看比较结果 "删除的行""新增的行""变更的行"会自动列出。对于变更的行,会按单元格列出变更前和变更后的值。

用好本工具的小技巧

  • 默认使用第1列作为识别行的键列,但如果数据中有ID或主键列,建议改用该列——即使行的顺序或数量发生变化,也能正确匹配对应的行。
  • 如果两个CSV都没有表头行,请取消勾选"将首行作为表头",系统会自动使用col1、col2……这样的序号列名进行比较。
  • "发生变化的行"部分会逐列比较键值相同的行,并仅列出存在差异的列,以"变更前→变更后"的形式展示。
  • TSV(制表符分隔)文件同样支持,只需将分隔符切换为"制表符",直接粘贴数据即可。
  • 除了上传文件,也可以直接粘贴从Excel或电子表格中复制的区域,比较效果相同。

CSV差异比较的应用场景

主数据更新前后的核对

将商品主数据或客户主数据导出为CSV,在更新作业前后进行比较,可以检查是否混入了不符合预期的改动。

系统迁移时的数据核对

将新旧系统分别导出的CSV进行比较,可用于确认迁移过程中数据是否存在遗漏或重复的"数据核对"工作。

批处理结果的验证

在日常或月度批处理执行前后分别导出数据表为CSV,验证是否仅有预期中的行被新增或更新。

电子表格变更记录的检查

粘贴从Excel或电子表格中复制的表格内容进行比较,可以快速找出多人协作编辑时被改动的部分。

API或抓取结果的差异监控

将定期从API获取的数据导出为CSV并逐日比较,可以追踪价格、库存数量等特定数值的变化时间点,及时发现异常波动。

数据库表结构变更前的备份比对

在对数据库表进行结构调整或批量修改前后分别导出CSV快照,比较结果可以作为变更是否符合预期的证据留存下来。

CSV差异比较术语表

键列
用于唯一识别每一行的列,通常指定为ID或主键所在的列。指定后,即使行的顺序发生变化,也能正确匹配对应的行。
表头行
CSV第一行中列出各列名称的行。启用"将首行作为表头"后,该行不参与差异比较,而是被当作列名使用。
分隔符
CSV中用于分隔各单元格值的符号,默认是逗号,但以制表符分隔的TSV也可以用同样的方式进行比较。
合并列列表
将比较源(A)和比较目标(B)的表头合并而成的列名列表,以A的列顺序为基准,并将B独有的列追加到末尾。仅存在于一方的列,在比较时会将另一方的值视为空。
变更单元格
在键值相同的行之间逐列比较后,值不一致的单元格,会并列显示变更前(A)和变更后(B)的值。
未变化行
在比较源和比较目标中都存在,且所有列的值完全一致的行,不会出现在差异列表中,仅计入摘要中的数量统计。
数据核对
系统迁移或批处理执行后,比较新旧数据是否一致的检查工作。将双方数据导出为CSV并按键列比较,可以高效完成这项通常需要逐行核对的任务。

常见问题

常用于比较导出的主数据在更新前后的差异,或验证系统迁移前后数据的一致性。即使CSV行数很多,也能立即提取出新增、删除、变更的行,比逐行肉眼核对能节省大量时间。

可以。行的匹配是基于所选"键列"的值进行的,因此即使两个文件中行的顺序不同,只要键值相同的行仍会被正确地对应比较。如果同一个键值出现多次,则以后出现的行为准。

可以。比较是基于由两个表头合并而成的列列表进行的,因此即使列的顺序不同,也能按列名正确对应。仅存在于一方的列,在计算差异时会将另一方的值视为空。

不会。所有比较处理都完全在浏览器内的JavaScript中完成,输入或上传的CSV内容不会被发送到任何服务器,即使是包含敏感信息的数据也可以放心使用。

会的。单元格的值是按字符串严格比较的,因此大小写的差异,以及前后多余的空格,都会被判定为"存在变更"。如果希望忽略这类格式差异,建议提前统一数据格式。
工具君

闲话 ― 为什么仅靠文本diff不足以比较CSV文件

比较两个CSV文件,传统做法通常是在Excel中并排肉眼核对两个工作表,或使用Git等工具进行基于行的文本diff。但由于CSV的每一行都用逗号并排包含多个值,基于行的diff只能告诉你"这一行变了",却无法一眼看出具体是哪一列发生了变化。本工具之所以按单元格级别定位变更之处,正是为了弥补这一缺陷。

在企业系统领域,将数据库表导出为CSV进行比较——通常称为"数据核对"——是一项常见工作。在确认迁移前后数据是否完全一致,或核实月度批处理结果是否符合预期时,涉及的行数往往达到数千甚至数万行。在这种规模下,按键列进行机械化核对就变得不可或缺。

Git等版本控制系统所使用的diff算法(如Myers差异算法)擅长检测行级别的新增与删除,但对于CSV这种"同一行只有部分列的值发生变化"的数据,未必是最合适的方案。本工具采用的先按键匹配行、再逐列比较单元格的方式,是专为表格型数据差异检测而设计的方法。