我工作十年,最怕的就是处理那种超大Excel文件。上个月财务部丢给我一个百万行的报表,说要按部门汇总全年数据。当时我打开文件,整个电脑直接卡成了幻灯片。
习惯性打开VBA编辑器,写了个循环遍历的宏。点运行,Excel直接白了,下面状态栏显示“正在计算(共10086个处理器)”,然后就崩了。我重启电脑再试,这次更惨,跑到一半弹窗说“内存不足”。
那几天我天天加班到十二点,就盯着那个进度条看。旁边的同事老张笑话我,说搞IT的还不如他用Ctrl C Ctrl V。最后我还是失败了,文件根本打不开,更别提处理。
后来公司新来了个95后小伙子,看我在那愁眉苦脸,他说“哥你试试Python呗”。我当时心里想,“这玩意儿比VBA还能打?”
结果他当着我的面,打开一个黑色窗口,敲了大概三行代码。真的就是三行。一行读取文件,一行做分组计算,一行保存结果。然后敲了下回车键,按了个Enter键。
大概过了两秒钟,那个让我崩溃了整整一周的报表,就处理完了。
我整个人都傻了。我问他“你确定数据都对吗”?他直接把结果打开,一个个数字验证,完全准确。百万行数据,从读入到出结果,总共耗时1.8秒。
VBA处理这类任务时是在Excel程序内部运行,每动一个单元格都要重绘界面。Python用pandas库直接在内存里处理数据,完全不在屏幕上折腾。
我后来自己学了点Python。现在每月处理财务报表,都是先用pandas读数据,然后groupby分组,apply应用函数,最后to_excel输出。整个过程不超过五秒。以前用VBA的时候,那个宏一跑就是半小时,中间还不能关电脑。
最讽刺的是,我过去十年一直在跟VBA较劲。写了几百个宏,每个都小心翼翼怕报错。结果换个工具,问题就这么简单。
现在谁跟我说Excel处理大数据快,我就让他试试打开一个五百万行的CSV文件。
当然我不是说VBA不好。处理几千行的数据,VBA还是顺手。但一旦数据量上了十万百万,真的就该换个思路。工具是死的,人是活的,折腾自己不如折腾工具。
那次之后我再也没写过VBA的循环遍历。同事找我处理大文件,我都统一回答“发我,两分钟”。不是炫耀,是真的只要两分钟。你问我这两分钟里发生了什么?就是电脑老老实实把数据算完了,我坐在旁边喝咖啡等着。
夜雨聆风