分享

一个多重文本替换问题(2):递归 - Excel函数式编程

 ExcelEasy 2024-08-02 发布于北京


上次我们介绍了一个多重文本替换的问题(一个多重文本替换问题(1) - Excel函数式编程),我们使用双重循环完成了要求。

视频留言中有几位朋友给出了其他的方法,都很好。其中有一位朋友是先将源数据合并成一个字符串,然后循环替换。最后拆分的方式尤其好,是我比较推荐的思路。

今天介绍一个用递归解决这个问题的方法。

用递归解决问题其实很简单,我之前介绍过不少这方面的内容(比如这里),前提是需要先有对问题的递归定义。

问题

原来的问题如下:

左表是源数据,其中的文本需要替换,规则是在右表中第一列的单词替换成第二列的单词。

分析


我们以B2为例,

Lorem ipsum dolor sit amet,

其中的ipsum需要替换为xpsum,dolor需要替换为dplor。

我们以str表示待替换的字符串,

以replArr表示右边的规则数组,

i表示当前替换到的规则数组中的序号,

函数replFunc表示替换函数,

那么,

replFunc(str, replArr, i)

表示已经使用规则数组replArr中的第 i 条规则(即已经用前 i 条规则完成了替换),如果 i = 5,也就表示我们完整了整个替换,

那么这个替换从逻辑上就可以表示为:

"先用这个函数去完成前 i - 1条规则的替换,然后对结果进行第 i 条规则的替换",

写成公式就是,

substitute(  replFunc(str, replArr, i - 1),   第i条规则的左边子字符串,  第i条规则的右边替换字符串

这就是这个逻辑的递推关系,据此,就可以写出递归定义:

=LET(    data, B2:B6,    replArr, E2:F7,    replFunc, LAMBDA(me,x,replarr,i,          IF(i = 0,              x,              SUBSTITUTE(me(me, x, replarr, i - 1), INDEX(replarr, i, 1), INDEX(replarr, i, 2))          )    ),    replFunc(replFunc, B2, replArr, ROWS(replARR)))

第4~9行就是递归定义。这里我们多使用了一个me参数,是为了在LET函数中使用自定义递归函数(具体原因请参见为什么递归函数用不了?- Excel 函数式编程

问题

上面的公式中,我们最后调用replFunc时,仅仅对B2进行了替换。

但是我们要替换的是一个区域中所有的字符串。

是否需要再使用一个递归函数呢?

当然可以再为左表定义一个递归函数。

不过完全用不到。因为考察我们对replFunc这个函数的定义,会发现其中的x是支持数组的,于是,我们可以直接将最后一行(第10行)改成对data的引用,

=LET(    data, B2:B6,    replArr, E2:F7,    replFunc, LAMBDA(me,x,replarr,i,        IF(i = 0,            x,            SUBSTITUTE(me(me, x, replarr, i - 1), INDEX(replarr, i, 1), INDEX(replarr, i, 2))        )    ),    replFunc(replFunc, data, replArr, 5))

结果如下:

详情咨询客服(底部菜单-知识库-客服)

Excel+Power Query+Power Pivot+Power BI


Power Excel 知识库    按照以下方式进入知识库学习
Excel函数   底部菜单:知识库->Excel函数

自定义函数  底部菜单:知识库->自定义函数

Excel如何做  底部菜单:知识库->Excel如何做

面授培训  底部菜单:培训学习->面授培训

Excel企业应用  底部菜单:企业应用

也可以在历史文章中学习Excel,Power Query,Power Pivot,Power BI,Power Automate各种技巧。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章