关于 列表对比工具
列表比较工具把粘贴进来的两份列表当作「按行构成的集合」,输出三份结果:只在 A 中的条目、两边都有的条目、只在 B 中的条目。每个结果面板都带独立计数和复制按钮,拿到就能直接用于下一步。
列表比较的价值,完全取决于比较之前做了怎样的归一化。同一批数据的两份导出,几乎不会在行尾空格、大小写、重复行算不算数这些事上达成一致。面板上方那四个复选框决定了全部规则。先把问题说清楚——「哪些账号在预发有、在生产没有」——再设置能让它可被回答的选项。
如何使用这个开发者工具
- 把一份列表粘贴到面板 A,另一份粘贴到面板 B,每行一个条目。
- 有意识地设置四个选项。默认「忽略首尾空白」和「忽略空行」是开的,「忽略大小写」是关的,「去重」是开的。
- 执行比较,读三个结果面板:仅 A、交集、仅 B,条目数就写在各自面板标题上。
- 如果某个计数出乎意料,一次只改一个选项再跑一遍。两次结果之差,正好告诉你是哪条归一化规则在起作用。
- 复制需要的那一份。三份输出都是换行分隔的纯列表,可以直接粘回查询语句、工单或别的工具里。
实例:两套环境的功能开关
列表 A 是预发环境的开关集合,从控制台复制出来,有几行带缩进,还重复了一项。列表 B 是生产环境,导出时用的是 Windows 换行。四个选项保持默认:忽略首尾空白开、忽略大小写关、忽略空行开、去重开。
A:
checkout_v2
dark_mode
legacy_banner
search_rerank
Dark_Mode
checkout_v2
B:
checkout_v2
dark_mode
search_rerank
promo_bar仅 A · 2
legacy_banner
Dark_Mode
交集 · 3
checkout_v2
dark_mode
search_rerank
仅 B · 1
promo_bar三条默认规则在这里都真的干了活。去首尾空白把「 legacy_banner」变成了可比较的值;去重把重复的 checkout_v2 收成一条;而 B 里的 Windows 换行,行切分器本来就吃得下,不需要任何选项。Dark_Mode 落在「仅 A」里,是因为忽略大小写是关的——对开关键名这是对的,换成邮箱地址就是错的。
为什么两个看起来一样的条目匹配不上
行切分同时支持 CRLF、CR 和 LF,混合换行永远不会造成误判。其余所有「看起来相同、比较起来不等」的原因都列在下面。
| 隐藏差异 | 去首尾空白能消除吗 | 怎么处理 |
|---|---|---|
| 行首或行尾空格 | 能 | 保持该选项开启 |
| 不换行空格 U+00A0,来自网页表格或 PDF | 仅首尾能 | 夹在中间的要先替换掉 |
| 表意空格 U+3000,来自中日文文档 | 仅首尾能 | 同上 |
| 字节序标记 U+FEFF,来自 Excel 导出 | 能 | 治本是导出时不写 BOM |
| 零宽空格 U+200B | 不能 | 去空白不把它当空白,需先删除 |
| 大小写,Dark_Mode 与 dark_mode | 不能 | 上游不区分大小写时才打开忽略大小写 |
| Unicode NFC 与 NFD,例如 café | 不能 | 比较前把两份导出归一化为 NFC |
| 行上残留的引号或逗号 | 不能 | 先在文本工作台去掉外壳 |
常见问题排查
两份列表明显有重合,交集却是空的。
成因 其中一份是从查询结果或表格里复制的,还带着原有格式:外层引号、行尾逗号、行首项目符号或列分隔符。每一行都因为这些字符而不同,于是一个都对不上。
解决办法 比较前先剥掉这层外壳。文本工作台可以一次性去掉每行的字面前缀和后缀,清理完再粘回这里。
三个计数加起来对不上两份输入的行数。
成因 默认开启了去重,所以列表内重复的值只算一次;空行也在比较前被丢掉了。
解决办法 对「是否存在」类问题,这通常正是你要的。当你想确认某份列表里到底有没有重复时,把去重关掉,再拿交集计数和原始行数对照。
明明两边都有的条目,却被判为「仅 A」。
成因 默认区分大小写,而且值内部的每个字符都算数。Dark_Mode 和 dark_mode 是两个条目,api.example.com 和 API.example.com 也是。
解决办法 上游不区分大小写时才打开忽略大小写,例如邮箱本地部分、主机名、Windows 路径。区分大小写的场景一律保持关闭:S3 对象键、Linux 路径、Base64 值,以及大多数标识符。
结果说两份列表相同,但你明明知道其中一份被重新排过序。
成因 这是集合比较。它只报告成员关系,位置和顺序在比较之前就被丢弃了。
解决办法 顺序有含义时请改用文本比较工具,比如路由表、迁移脚本序列,或者行号本身有意义的 CSV。
适合用这个工具的场景
- 找出哪些标识符只存在于某一个环境、租户或导出文件中。
- 迁移前把待发布清单和资产清单对一遍,不用写查询。
- 把预期的文件、开关或权限清单,与系统实际报告的内容做核对。
- 给单份列表去重:粘进 A,B 留空,「仅 A」面板就是去重后的集合。
应该换用别的工具的场景
- 比较同一份有序文档的两个版本。文本比较工具会保留位置,并显示什么被移动了。
- 比较每行含多个字段的记录。把数据丢进 JSON 转表格工具,或者只比较你真正用作键的那个字段,而不是整行。
- 统计每个值出现了多少次。这里的结果是集合而非计数,分组查询或表格透视才是正解。
隐私与数据处理
两份列表的切分、归一化和求交都在当前浏览器标签页完成,不上传,刷新即消失。这里比较的通常是导出数据——用户 ID、邮箱、订单号——恰恰是不该不假思索地粘进公开工具的那类内容。建议比较有代表性的切片,而不是完整导出。
相关开发者工具
常见问题
工具在意 Windows 换行吗?
不在意。任何处理之前,行都会按 CRLF、CR 或 LF 切分,所以一边粘 Windows 导出的文件、另一边粘 Unix 的,不用改任何选项。换行符对做差异比较是个真问题,但在这里不是。
怎么给单份列表去重?
粘进面板 A,面板 B 留空,保持去重开启,然后执行比较。所有内容都会落在「仅 A」面板里,重复项已合并、空行已去掉,面板标题上的数字就是去重后的条目数。
为什么忽略大小写默认是关的?
开发者要比较的东西大多区分大小写:对象键、Linux 路径、令牌、Git 引用、开关名。悄悄转成小写会把真实系统视为不同的条目合并掉。把它打开,应该是一次明确的判断:上游系统确实不区分大小写。
去重只影响计数,还是也影响出现的条目?
两者都影响。开启去重时,每个不同的值只在它所属的面板里出现一次。关闭后,「仅 A」和交集会按值在列表 A 中出现的次数重复,「仅 B」对列表 B 同理。
能一次比较三份以上的列表吗?
一次不行。先比较 A 和 B,复制交集,再拿它去和第三份比较。对成员关系类问题这样串联是正确的,因为求交满足结合律。
计数没问题,但结果的顺序看起来很随意,为什么?
结果面板保留来源列表的顺序:「仅 A」和交集跟随列表 A,「仅 B」跟随列表 B。这里不做任何排序,便于你认出原来的分组。需要按字母序时,把输出丢进文本工作台排序即可。