前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从财务凭证摘要中提取人名信息,简单的两种方法及优化思路

从财务凭证摘要中提取人名信息,简单的两种方法及优化思路

作者头像
大海Power
发布2021-08-31 11:46:19
7700
发布2021-08-31 11:46:19
举报
文章被收录于专栏:用户8950297的专栏

最近遇到从财务凭证摘要里提取信息的情况比较多,一是学员的提问,还有就是最近的项目上也多次涉及到这样的需求,比如下面这个,要求从摘要里把人名提取出来:

又如这种:

实际情况一般没有这么乱,因为大多数公司的财务录数据时都相对规范,但也正因为财务录摘要往往都比业务录系统还规范完整,所以很多从业务系统拿不到的数据,反而可以通过从财务凭证摘要里分离出来进行分析,这一点真要给财务人员点赞!

这里还是从比较乱的角度先探讨比较通用的方法,后面再说一说根据实际情况可以进行优化的一些思路。

首先,在这种比较乱的情况下,是不可能通过分列之类的操作来实现的,至于如Excel里的智能填充(Ctrl + E)之类的更是不用去想。

所以,主要考虑通过关键字(词)匹配的方式把它给“搜”出来——因为对于人名来说,我们通常会有公司的通讯录,或一些专门的花名册:

把财务凭证和通讯录2个表的数据接入PQ后,实现方式其实也比较简单,具体如下:

- 方法1 -

引用通讯录表(初学者习惯引用表的比较多),对其中的姓名是否被包含(Text.Contains)在当前的摘要中,不(not)包含则跳过(Table.Skip),在最后剩下的表内容中取姓名列的第一个(List.First),公式如下:

代码语言:javascript
复制
List.First(
    Table.Skip(
       通讯录,
       (x)=>not(Text.Contains([财务凭证摘要],x[姓名]))
    )[姓名]
)

- 方法2 -

或者更简单一点,直接用通讯录的姓名列做判断,List.Skip函数的使用跟Table.Skip函数的用法类似,公式如下:

代码语言:javascript
复制
List.First(
    List.Skip(
       通讯录[姓名],
       (x)=>not(Text.Contains([财务凭证摘要],x))
    )
)

更多类似例子还可以参考文章《多个关键词匹配查找问题,这个方法可能更优!》,或通过手机端在公众号搜索Table.Skip等函数查看更多应用案例。

- 优化思路 -

使用上面的方法,对于每个摘要,都得从通讯录表里搂一遍,如果凭证的数据量很大且通讯录上的人名也很多的话,那效率可能会比较低,对此,可以通过Table.Buffer或List.Buffer等在一定程度上提升效率,具体方法可参考文章:

此外,当实际数据本身是比较规范的情况下——如上面例子的实际情况见下图,其中90%以上都是在同一个位置:

建议先做分列并与名册合并查询做一次匹配,匹配不出来的部分再用姓名去做关键词包含性匹配——一般来说,分列和合并查询的效率是比较高的,具体怎么做?自己按着思路试一试?

很多时候,只有自己真正动脑想过、动手试过,才能真正掌握一项知识,并学以致用。

更多关于提升Power Query效率的方法或案例,请参考《这6个极大提高PQ数据处理速度的案例,快看看是不是你的情况!》。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Excel到PowerBI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档