分享

怎么从一串文本中提取出想要的部分?

 刘卓学EXCEL 2021-04-02
如下图所示,A列是一些包含了很多信息的字符串,现在要将红色字体的品牌部分提取出来,结果如B列所示。如果让你来做,你会如何解决呢?

观察一下,我们就可以发现,数据源很有规律:不同信息之间用分号分隔,内部之间又用冒号分隔。提取的方法还是有挺多的,我来分享3种方法。

方法1:
在B2单元格输入下面的公式,下拉填充。

=TRIM(LEFT(SUBSTITUTE(MID(A2,FIND("品牌:",A2),99),";",REPT(" ",99)),99))


FIND("品牌:",A2)这部分用find函数查找“品牌:”A2单元格中的位置,返回32。MID(A2,FIND("品牌:",A2),99)这部分用mid函数从A2单元格的第32个字符开始提取,提取的长度是99,返回的结果为"品牌:TPR;零件号:TP322500-0"。

SUBSTITUTE(MID(A2,FIND("品牌:",A2),99),";",REPT(" ",99))这部分用substitute函数将"品牌:TPR;零件号:TP322500-0"这个字符串中的分号替换为99个空格。

REPT(" ",99)这部分是用rept函数将空格重复99次,那当然就是99个空格了。

LEFT(SUBSTITUTE(MID(A2,FIND("品牌:",A2),99),";",REPT(" ",99)),99)这部分用left函数将替换后的字符串从左边截取99个字符。这样肯定会有多余的空格,所以最后用trim函数将多余的空格去除。

方法2:
在B2单元格中输入下面的公式,下拉填充。

=MID(A2,FIND("品牌:",A2),FIND(";",A2,FIND("品牌:",A2))-FIND("品牌:",A2))


这个公式我只说下思路吧,就不一步一步的拆解公式了。主要是用mid函数提取,首先要找到提取的起始位置,然后再计算出提取的长度。

起始位置可以用find函数找"品牌:"在A2中的位置,比较简单。提取的长度就稍有一点繁琐,是用"品牌:"之后的第1个分号的位置减去"品牌:"的位置。

"品牌:"之后的第1个分号的位置FIND(";",A2,FIND("品牌:",A2))这部分。还是用find函数找分号的位置,只不过不是从开始找,而是从"品牌:"之后的位置开始找。

方法3:

在B2单元格输入下面的公式,下拉填充。

=FILTERXML("<a><b>"&SUBSTITUTE(A2,";","</b><b>")&"</b></a>","a/b[starts-with(.,'品牌:')]")


这个公式用的是filterxml的分列用法,以分号为分隔符进行分列,这样就将字符串分成了几部分。然后再筛选出以"品牌:"开头的那部分,就得到最终的结果。

公式中红色的部分就是之前分享过的分列用法,不了解的小伙伴可以看《分列提取你还在用老套路吗?该尝试个新套路了。》这篇文章。

[starts-with(.,'品牌:')]蓝色这部分可以看作筛选的条件,从所有的b元素中筛选出以"品牌:"开头的那些。starts-with是xpath中自带的函数,有2个参数,用来判断第1参数的字符串是否以第2参数的字符串开头。

power query中也有相同功能的函数,学过pq的小伙伴很容易理解。

最后补充个vba代码的方法:
代码如下:
Sub 提取品牌() Dim rng As Range, i As Integer Dim arr As Variant, em As Variant i = 2 For Each rng In Range("a2:a5") arr = Split(rng.Value, ";") For Each em In arr If em Like "品牌:*" Then Cells(i, "b") = em Next i = i + 1 NextEnd Sub
文件链接:

https://pan.baidu.com/s/1S0KiUnJnMIJwSfJHiaA0IA

提取码:5dqb

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多