并交差集在数据核对中的三种用法

· 约 4 分钟 🧹 文本去重

财务对账、用户名单核对、名单迁移验证——这些任务的本质是两个集合之间的”差集、并集、交集”。用 SQL 能做,用 Excel vlookup 也能做,但最轻巧的是把两份名单粘进文本工具,一键出结果

三种基础运算

两份名单 A 和 B:

A = {张三, 李四, 王五, 赵六}
B = {李四, 王五, 孙七, 周八}

三种运算的结果:

运算符号结果含义
并集A ∪ B张三, 李四, 王五, 赵六, 孙七, 周八任意一份里出现的
交集A ∩ B李四, 王五两份都有的
差集 A - BA \ B张三, 赵六只在 A 里的
差集 B - AB \ A孙七, 周八只在 B 里的
对称差A Δ B张三, 赵六, 孙七, 周八恰好在一份里的

用法 1:对账找差异

场景

财务系统有一份应收名单(A),银行到账流水有一份实收名单(B)。要找:

  • 应收未收(A - B):客户欠款
  • 未应收已收(B - A):异常进账,可能是其他客户或系统错账
  • 正常对齐(A ∩ B):不需处理

操作

  1. 从财务系统导出一列 订单号,粘到工具左侧
  2. 从银行流水导出对应列,粘到右侧
  3. 选”差集 A - B”,得到欠款订单号
  4. 选”差集 B - A”,得到异常进账
  5. 导出结果,各自去对应系统查详情

5 分钟做完的事,vlookup 慢慢建辅助列要半小时。

用法 2:数据迁移验证

场景

从老系统迁移用户数据到新系统。迁移后要验证”所有用户都迁过去了,没有多也没有少”。

操作

  1. 老系统导一列 UserID
  2. 新系统导一列 UserID
  3. 算对称差 A Δ B——理论上应为空
  4. 如果不为空:
    • 只在老系统的 → 漏迁
    • 只在新系统的 → 意外多出(可能是测试数据污染)

一次对称差能暴露所有迁移问题。

用法 3:去重 + 频次

不是严格的集合运算,但同工具常提供:

场景

某次活动报名表汇总了多个渠道,要:

  • 整体有多少人(去重后的人数)
  • 哪些人报了多次(可能是水军或误提交)

操作

  1. 粘入所有报名记录(可能几千条)
  2. 选”按行去重并统计频次”
  3. 结果按出现次数降序:
    13812345678   5
    13987654321   3
    13611112222   2
    ...
  4. 筛出频次 > 1 的看情况处理

常见陷阱

1. 空白字符不一致

"Alice "(末尾空格)vs "Alice"

严格比较下不等,导致”同一个人被分成两份”。

对策:对比前打开”trim 首尾空白”和”折叠连续空白”。

2. 大小写不一致

"ALICE@example.com" vs "alice@example.com"

邮箱一般不区分大小写,但严格字符串比较会当两个。

对策:打开”统一转小写”。身份证的 X/x 也同理——但身份证用小写是不规范的,建议业务规则里强制大写。

3. 全角半角

"ABC123" vs "ABC123"

表单里用户打字经常混用。

对策:用 Unicode 工具做 NFKC 归一化后再比较;或在对账前统一转半角。

4. 肉眼不可见字符

"123​4"(中间有 U+200B 零宽空格)vs "1234"

粘贴富文本或从网页复制时混入。

对策:先用文本清洗工具剥离不可见字符,再做集合运算。

5. 排序导致误判

集合运算不关心行顺序,但有些工具做”逐行比较”——A 的第 5 行和 B 的第 5 行对比——结果完全不对。确保选的是集合运算,不是逐行 diff

更高级:按字段对齐

有时一行是结构化数据:

A: 1001,张三,市场部
A: 1002,李四,研发部

B: 1001,张三,销售部      ← 部门变了
B: 1003,王五,研发部      ← 新增

按整行对比:1001 张三的那条算”不同”——但你想知道是什么字段变了。方法:

  1. 先按 UserID(第一列)对齐
  2. 对齐后的行按字段逐一对比
  3. 输出变更字段明细

这个工作流通常需要工具提供”按列分隔”模式,或者分两步:先用 UserID 做集合运算找差异 ID,再拿结果回去 Excel/SQL 查详情。

对账的标准流程

稳定对账的三步法:

  1. 准备:两边都导成”一列纯文本”,去表头、去空行
  2. 清洗:trim、lowercase(如果业务允许)、去不可见字符
  3. 运算:差集 A-B、差集 B-A、交集;分别导出后进对应系统查

每个月重复这三步能定位所有异常。出错是清洗不彻底或字段对齐错,不是算法本身。

实操一下

把两份名单粘进工具左右两栏,一键出并集、交集、A-B、B-A;支持忽略大小写、trim、折叠空白;结果可一键复制或下载 CSV——对账、去重、迁移校验几秒搞定,不用写 SQL 不用拖 vlookup。

❓ 常见问题

两份 Excel 对比找差异,vlookup 和集合运算哪个快?

集合运算快 10 倍。vlookup 需要建辅助列、选源区域、处理找不到的情况;而"按行取差集"只要把两列各自复制到工具里、一键出"只在 A 里"、"只在 B 里"、"两边都有"三份结果。尤其当行数过万,vlookup 会卡,集合运算是 Set 哈希查找 O(n)。

忽略大小写、忽略空白怎么处理?

工具通常提供开关——"统一转小写"、"trim 首尾空白"、"折叠连续空白为单个"。对账时记得打开这三个,否则 Alicealice 会被判定为两个人。注意身份证、订单号这种严格大小写字段不要开"忽略大小写",X 和 x 在身份证校验里不同。

数据量很大会不会浏览器卡?

现代浏览器 JavaScript Set 在 10 万行以内完全顺畅,百万行仍可秒算。真正让浏览器卡的是"渲染"——结果如果有 10 万行并全部 DOM 渲染会慢。好工具会虚拟滚动只渲染可见部分,或提示"结果过大只显示前 1000 行,请下载完整版"。

集合运算能处理带标签的数据吗(比如 UserID + 部门)?

可以,但要确定"哪一列决定身份"。做法:取 UserID 列做集合运算得到差异 ID 列表,再用 vlookup 或 Excel 筛选把对应行找出来。集合运算本身只处理"行等不等"——想按部分字段比较,用 JOIN column 或正则提取关键字段先对齐。

🧹 打开 文本去重 按行/分隔符去重·频次统计·并/交/差集·忽略大小写·空白