ARTICLE · 1232513
Excel装不下的1110万行数据,我用两段脚本搞定了
看着电脑屏幕上那两个密密麻麻的文件夹,我靠在椅背上叹了口气。
手头接了一项棘手的数据核对活儿:业务系统做了一次数据同步,我需要把"同步前导出"和"同步后导出"两个时点的数据放在一起,做一次全量比对,看看总行数对不对得上、各个字段有没有在同步过程中被改乱。
听起来只是一次常规的数据比对,但麻烦全在数据导出的格式上。
这批数据一共涉及四张核心业务表。因为导出限制,单次单个文件最多只能装6万条记录,一旦超限就会自动按序号往后拆——比如一张表有12万条数据,就会被拆成 _01 和 _02 两个文件。我点开文件夹拉到底看了一眼,心凉了半截:光是其中最大的一张表,足足被拆成了185个文件。
这意味着单这张表就有1110万行数据。平时习惯的Excel技巧在这里彻底失灵了——别说跨几百个文件去写函数,就算想把它们合并成一个 .xlsx 文件都不可能,因为Excel单个工作表的上限也就一百零几万行,强行塞进去只会换来电脑风扇狂转和软件无响应。
如果你也经常和几十万行以上的表格打交道,下面这套"先入库、再比对"的路子,或许能帮你省下一个通宵。
一、好的开始,是 AI 没有立刻给我甩代码
以前用 AI 写东西,我总习惯直接下命令:"帮我写个对比表格的脚本。"结果往往是 AI 顺着我给的半截信息一通乱猜,写出来的代码放到本地根本跑不通,光改报错就要折腾半天。
这次学乖了,我先把真实的处境、数据是怎么拆的、难在哪里,像跟同事交底一样精简后发了过去:
四张表导出的数据散落在几百个文件里(最大的表拆了185个文件),现在要对比两个时点的总数和字段。Excel 扛不住,有什么好办法能用 Python 直观高效地对比?
AI 很快给出了主意:既然 Excel 装不下,又不想折腾笨重的数据库服务器,最省事的办法是用轻量级的本地分析库 DuckDB——写个脚本把几百个文件自动读进去建成表,然后直接用 SQL 查差异,"千万级数据也就是几秒钟的事"。
但最让我感到踏实的,不是这个方案本身,而是 AI 接下来没有急着默写代码,反而先向我确认了表名、联合主键、表头格式以及最终想要的结果形式。这种先把边界条件问清楚的习惯,让后面的代码几乎没有走弯路。
二、分成两步走,比一步到位更稳当
拿到我补充的信息后,AI 给我设计了两个分开运行的脚本:
第一步(入库与体检):只干脏活累活,负责把两个目录里的几百个文件读出来塞进本地数据库,顺便检查表头和行数是否异常。
第二步(比对与报告):直接在已经入库的数据上跑比对逻辑,输出汇总报告。
当时我还觉得分两个脚本有点啰嗦,直到后面开始调规则时,才庆幸还好分开了——因为读取几百个文件最费时间(在我这台电脑上跑了不到两分钟),而调整比对规则只需要在库里重跑第二步,几秒钟就能出结果,完全不用重头再读一遍文件。
而且在跑代码之前,AI 还在说明里主动提醒了我三件事:首尾空格会自动清洗,空串统一按 NULL 处理;为了防止长编号变形,建议全部按字符串读入;同时提醒我,如果联合主键本身在同步过程中被改了,机器比对时会表现为"一条旧记录被删除 + 一条新记录被新增"。
为了方便排查,脚本在入库时还顺手给每条数据加了一列来源文件名。后来证明,这个小设计帮了大忙——不然在几百个文件里找一条报错数据,简直是大海捞针。
三、吓人的155万条差异,原来是个乌龙
环境准备好后,我依次跑完了第一步和第二步。先核对总行数:两边总数一致,新增和删除的数量均为零,说明底数没丢。
但当我满怀期待地打开字段比对结果时,看清数字的那一刻,我后背一凉。
在其中一张核心表的核对报告里,单单某个金额字段这一个地方,系统就报出了1,554,964条不一致!
一百五十多万条数据对不上?难道同步的时候把金额全搞砸了?
我赶紧定了定神,按 AI 给的分层排查 SQL,在命令行里把这个字段的差异明细调出来看了一眼。当屏幕刷出具体数值的那一秒,我真是又好气又好笑:其中绝大多数,是同步前写着 0.000000、同步后变成了 0;剩下零星几条,是 60000.000000 变成了 60000。
数值其实分毫不差,纯粹是因为两个时点的导出程序对小数位的处理习惯不同——一个默认保留6位小数,另一个直接把零全抹掉了。而这正是我们为了保护长编号,把所有字段统一按"字符串"读入带来的副作用:机器老老实实地逐字比对,自然把 0.000000 和 0 当成了天壤之别。
这就是实际工作里最折磨人的"假差异"。如果混在几百万行数据里用肉眼慢慢翻,不仅心态会崩,真正有问题的几处业务异常也会被彻底淹没在这片噪音里。
好在数据已经在数据库里了。我让 AI 调整了比对脚本:在对比金额字段前,先在 SQL 里统一转成数值类型再做比较。改完再跑一遍,刚才那155万条吓人的差异瞬间清零。
剔除这些格式乌龙后,最终真正需要人工复核的真实业务差异,其实只有37条。
四、折腾完这摊活,我留下的几点经验
如果平时你也需要和成堆的表格、千万级的数据打交道,这几点实战经验或许能帮你少走弯路:
1.先跟 AI 把需求边界聊清楚,再让它写代码: 别急着下命令"写个脚本",先把数据怎么拆的、难在哪、要什么结果交代明白。边界问清楚了,代码几乎不走弯路。 2.先对总数和主键,别一上来就扎进明细里: 拿到数据先看总行数和唯一主键能不能对齐。如果底数都不对,后面比对具体字段全是无用功。 3.先把格式噪音洗干净,真问题才会露出来: 永远不要盲目相信两批数据的原始格式。首尾多余的空格、空字符串与 NULL、以及金额和编号因数据类型不统一(如字符串比对数字、小数位长短不一)造成的假差异,必须在比对前优先清洗掉。 4."入库"与"比对"必须拆成两个脚本: 文件多的时候,读取和转换最耗时。先把数据稳稳地落到本地库里,再去慢慢调试比对逻辑,这样每次修改规则都只需要几秒钟。 5.多文件合并,一定要留个"来源文件名"字段: 几百个文件混在一起后,如果没有溯源列,就算查出某条数据有问题,你也找不到它原本藏在第几个文件里。 6.把能重复跑的脚本留下来: 工作里的数据核对,很少有一锤子买卖。留好脚本的人,只需要换个文件夹、按一下回车,剩下的时间就可以安心去喝杯咖啡了。
工具的进化,是为了把我们从机械的核对地狱里解放出来。省下来的时间,才够去想那37条到底意味着什么。















































































