用Python批量读取、清洗和合并PDF数据
前言:AI很强大,但有些事不能托管
博主开通公众号后,最近刷到很多类似《看我怎么把100个表格、几百个PDF交给AI生成数据》的黑科技文章。AI就能自动识别、整理、输出一个标准化的数据表,看起来很酷,但作为审计人,我们是不是应该多想一想?
第一:数据安全是否可控
银行流水、合同扫描件、结算单据……这些文件里记录的是客户账号、交易对手信息、合同金额等敏感经营信息,把这些文件上传到云端AI平台,如何来确保数据传输、使用和存储过程中是安全性?而在审计行业,数据安全不是选择题,是我们的底线。
第二:数据质量是否保证
AI确实很强,但它也有“幻觉”。相信用过AI的朋友总会见过AI偶尔的胡说八道和张冠李戴,如果仅是了解一些信息,你完全可以容忍这些小插曲,但如果你要将生成的信息用于审计等具体业务,就要认真思考一个问题,当数据出错时,谁来背锅?是AI?是平台?还是你?
第三:处理过程能否追溯
当你把数据交给AI,就像把一个重要的计算题交给了“黑箱”。你看的到输入,看的到输出,但唯独不知道中间的处理过程。而审计工作,特别是基础的数据清洗整理工作,恰恰最需要就是可追溯、可验证、可解释。只有确定的代码,确定的逻辑,才能让我们知道每一个循环,每一次判断到底做了什么,才能保证我们能看到、能验证、能放心地使用。
下面介绍我们的第二个脚本--PDF批量读取工具,它不会把数据传给任何第三方,所有处理都在本地完成,虽然你只需点几下鼠标,但你看到的,就是你想要的。
01 典型场景
场景一:多银行流水分析
我们要跑一个银行流水,拿到文件后,某银行的格式长这样:
某银行的又是这样:
这样的文件,一个大行可能有几千份,若采用手动复制处理,仅是统一表头我想想都会崩溃,更别说后续的清洗合并、统计分析了。
场景二:表格跨页与表头丢失
跑某个结算项目,取得的结算文件中,有的前几行是“单位、日期等附加信息(后续我们简称为表头前信息)而这些信息我们又不能舍弃。有的跨页数据没有表头,同时列名也经常变化。我们不可能把几千个文件都打开统计出详细的格式信息,那么通过智能提取,同列名合并可能是解决问题的最优方法。
场景三:表格末尾统计信息
一些PDF文件中,每页表格的最后几行往往会增加一些诸如小计、合计的统计或附注信息,比如银行流水的打印时间,结算单的备注信息等,如果把这些非业务数据当作正常数据读进去,可能恰好就污染了我们的数据,导致统计错误,分析失真,因此需要自动识别并删除这些尾巴。
02 解决思路
第一步:定位表头行
程序支持目标列关键词定位,你的关键词不需要全,但一定要是全表通用的字段,脚本通过扫描每页的前20行,找到与目标列名匹配度最高的那一行作为表头。当然,最不理想的情况下,你可能无法确定一个关键字,因为毕竟那么多的文件,那么程序只能扫描前20行数据,通过逻辑判断排除掉有独立数字的、有日期时间的等等,最终选择最可能的行作为目标表头。
第二步:清洗表尾数据
针对很多表格的最后一行可能包含统计、备注等非业务数据。程序同样支持排除关键词设定(多个用逗号分隔),程序会自动检测最后一行是否包含这些词,如果是,直接删除。同样,你也可能不知道,那么程序会检测最后一行的非空数据占比,若小于50%则默认删除。
第三步:提取表头前信息
某些PDF表头上面设置了单位、业务类型、日期时间等一些关键信息摘要,程序会以查找到的表头行为依据,将其上面的内容信息全部提取出来,作为一个新列填充到数据中,方便分析人员提取使用。
第四步:数据合并与保存
由于pdfplumber核心机制是依赖字符坐标来构建网格,但一般PDF表格没有边框,因此只能靠字符对齐来判断,不可避免地会出现一些像素偏移而导致的单元格错分、表头信息分割等意外情况。为确保数据完整可靠,程序首先读取保存每一页面的表格信息,将同文件各页面的数据按表头一致匹配进行初次合并,然后再对同一文件下的所有文件进行二次匹配合并,两次执行后不同表头的表格将单独保存为一个CSV文件,后续的进一步合并,只能依靠屏幕面前的你。
03 写在最后
细心的朋友可能会发现,工具箱增加了一个注册功能。在此我想解释一下,增加该功能,并不是为了收费,我只是希望大家能经常来公众号坐坐,分享脚本的使用的情况,提出宝贵的改进意见和建议。毕竟我一个人的经验是有限的,你的反馈、你的场景、你的需求,才是这个工具箱不断进化的真正动力。因此我先设定了60天的超长试用期,试用期结束后,如果你需要,请来我这点个赞,留个言,我会免费将注册时长延长半年,以此类推……
目前脚本已集成到我们的审计工具箱中,你可以关注公众号,在后台回复关键词 “PDF批量提取”,我会定时将下载链接和使用说明发给你。开发不易,如果可以,请点个赞,谢谢❤️
夜雨聆风