财务对账、用户名单核对、名单迁移验证——这些任务的本质是两个集合之间的”差集、并集、交集”。用 SQL 能做,用 Excel vlookup 也能做,但最轻巧的是把两份名单粘进文本工具,一键出结果。
三种基础运算
两份名单 A 和 B:
A = {张三, 李四, 王五, 赵六}
B = {李四, 王五, 孙七, 周八}
三种运算的结果:
| 运算 | 符号 | 结果 | 含义 |
|---|---|---|---|
| 并集 | A ∪ B | 张三, 李四, 王五, 赵六, 孙七, 周八 | 任意一份里出现的 |
| 交集 | A ∩ B | 李四, 王五 | 两份都有的 |
| 差集 A - B | A \ B | 张三, 赵六 | 只在 A 里的 |
| 差集 B - A | B \ A | 孙七, 周八 | 只在 B 里的 |
| 对称差 | A Δ B | 张三, 赵六, 孙七, 周八 | 恰好在一份里的 |
用法 1:对账找差异
场景
财务系统有一份应收名单(A),银行到账流水有一份实收名单(B)。要找:
- 应收未收(A - B):客户欠款
- 未应收已收(B - A):异常进账,可能是其他客户或系统错账
- 正常对齐(A ∩ B):不需处理
操作
- 从财务系统导出一列
订单号,粘到工具左侧 - 从银行流水导出对应列,粘到右侧
- 选”差集 A - B”,得到欠款订单号
- 选”差集 B - A”,得到异常进账
- 导出结果,各自去对应系统查详情
5 分钟做完的事,vlookup 慢慢建辅助列要半小时。
用法 2:数据迁移验证
场景
从老系统迁移用户数据到新系统。迁移后要验证”所有用户都迁过去了,没有多也没有少”。
操作
- 老系统导一列
UserID - 新系统导一列
UserID - 算对称差 A Δ B——理论上应为空
- 如果不为空:
- 只在老系统的 → 漏迁
- 只在新系统的 → 意外多出(可能是测试数据污染)
一次对称差能暴露所有迁移问题。
用法 3:去重 + 频次
不是严格的集合运算,但同工具常提供:
场景
某次活动报名表汇总了多个渠道,要:
- 整体有多少人(去重后的人数)
- 哪些人报了多次(可能是水军或误提交)
操作
- 粘入所有报名记录(可能几千条)
- 选”按行去重并统计频次”
- 结果按出现次数降序:
13812345678 5 13987654321 3 13611112222 2 ... - 筛出频次 > 1 的看情况处理
常见陷阱
1. 空白字符不一致
"Alice "(末尾空格)vs "Alice"
严格比较下不等,导致”同一个人被分成两份”。
对策:对比前打开”trim 首尾空白”和”折叠连续空白”。
2. 大小写不一致
"ALICE@example.com" vs "alice@example.com"
邮箱一般不区分大小写,但严格字符串比较会当两个。
对策:打开”统一转小写”。身份证的 X/x 也同理——但身份证用小写是不规范的,建议业务规则里强制大写。
3. 全角半角
"ABC123" vs "ABC123"
表单里用户打字经常混用。
对策:用 Unicode 工具做 NFKC 归一化后再比较;或在对账前统一转半角。
4. 肉眼不可见字符
"1234"(中间有 U+200B 零宽空格)vs "1234"
粘贴富文本或从网页复制时混入。
对策:先用文本清洗工具剥离不可见字符,再做集合运算。
5. 排序导致误判
集合运算不关心行顺序,但有些工具做”逐行比较”——A 的第 5 行和 B 的第 5 行对比——结果完全不对。确保选的是集合运算,不是逐行 diff。
更高级:按字段对齐
有时一行是结构化数据:
A: 1001,张三,市场部
A: 1002,李四,研发部
B: 1001,张三,销售部 ← 部门变了
B: 1003,王五,研发部 ← 新增
按整行对比:1001 张三的那条算”不同”——但你想知道是什么字段变了。方法:
- 先按 UserID(第一列)对齐
- 对齐后的行按字段逐一对比
- 输出变更字段明细
这个工作流通常需要工具提供”按列分隔”模式,或者分两步:先用 UserID 做集合运算找差异 ID,再拿结果回去 Excel/SQL 查详情。
对账的标准流程
稳定对账的三步法:
- 准备:两边都导成”一列纯文本”,去表头、去空行
- 清洗:trim、lowercase(如果业务允许)、去不可见字符
- 运算:差集 A-B、差集 B-A、交集;分别导出后进对应系统查
每个月重复这三步能定位所有异常。出错是清洗不彻底或字段对齐错,不是算法本身。
实操一下
把两份名单粘进工具左右两栏,一键出并集、交集、A-B、B-A;支持忽略大小写、trim、折叠空白;结果可一键复制或下载 CSV——对账、去重、迁移校验几秒搞定,不用写 SQL 不用拖 vlookup。