从财务凭证摘要中提取人名信息,简单的两种方法及优化思路
最近遇到从财务凭证摘要里提取信息的情况比较多,一是学员的提问,还有就是最近的项目上也多次涉及到这样的需求,比如下面这个,要求从摘要里把人名提取出来:
又如这种:
实际情况一般没有这么乱,因为大多数公司的财务录数据时都相对规范,但也正因为财务录摘要往往都比业务录系统还规范完整,所以很多从业务系统拿不到的数据,反而可以通过从财务凭证摘要里分离出来进行分析,这一点真要给财务人员点赞!
这里还是从比较乱的角度先探讨比较通用的方法,后面再说一说根据实际情况可以进行优化的一些思路。
首先,在这种比较乱的情况下,是不可能通过分列之类的操作来实现的,至于如Excel里的智能填充(Ctrl + E)之类的更是不用去想。
所以,主要考虑通过关键字(词)匹配的方式把它给“搜”出来——因为对于人名来说,我们通常会有公司的通讯录,或一些专门的花名册:
把财务凭证和通讯录2个表的数据接入PQ后,实现方式其实也比较简单,具体如下:
- 方法1 -
引用通讯录表(初学者习惯引用表的比较多),对其中的姓名是否被包含(Text.Contains)在当前的摘要中,不(not)包含则跳过(Table.Skip),在最后剩下的表内容中取姓名列的第一个(List.First),公式如下:
List.First(
Table.Skip(
通讯录,
(x)=>not(Text.Contains([财务凭证摘要],x[姓名]))
)[姓名]
)
- 方法2 -
或者更简单一点,直接用通讯录的姓名列做判断,List.Skip函数的使用跟Table.Skip函数的用法类似,公式如下:
List.First(
List.Skip(
通讯录[姓名],
(x)=>not(Text.Contains([财务凭证摘要],x))
)
)
更多类似例子还可以参考文章《多个关键词匹配查找问题,这个方法可能更优!》,或通过手机端在公众号搜索Table.Skip等函数查看更多应用案例。
- 优化思路 -
使用上面的方法,对于每个摘要,都得从通讯录表里搂一遍,如果凭证的数据量很大且通讯录上的人名也很多的话,那效率可能会比较低,对此,可以通过Table.Buffer或List.Buffer等在一定程度上提升效率,具体方法可参考文章:
此外,当实际数据本身是比较规范的情况下——如上面例子的实际情况见下图,其中90%以上都是在同一个位置:
建议先做分列并与名册合并查询做一次匹配,匹配不出来的部分再用姓名去做关键词包含性匹配——一般来说,分列和合并查询的效率是比较高的,具体怎么做?自己按着思路试一试?
很多时候,只有自己真正动脑想过、动手试过,才能真正掌握一项知识,并学以致用。
更多关于提升Power Query效率的方法或案例,请参考《这6个极大提高PQ数据处理速度的案例,快看看是不是你的情况!》。
【近期热门合集/文章】