怎么从一串文本中提取出想要的部分?
观察一下,我们就可以发现,数据源很有规律:不同信息之间用分号分隔,内部之间又用冒号分隔。提取的方法还是有挺多的,我来分享3种方法。
=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函数将多余的空格去除。
=MID(A2,FIND("品牌:",A2),FIND(";",A2,FIND("品牌:",A2))-FIND("品牌:",A2))
这个公式我只说下思路吧,就不一步一步的拆解公式了。主要是用mid函数提取,首先要找到提取的起始位置,然后再计算出提取的长度。
起始位置可以用find函数找"品牌:"在A2中的位置,比较简单。提取的长度就稍有一点繁琐,是用"品牌:"之后的第1个分号的位置减去"品牌:"的位置。
"品牌:"之后的第1个分号的位置是FIND(";",A2,FIND("品牌:",A2))这部分。还是用find函数找分号的位置,只不过不是从开始找,而是从"品牌:"之后的位置开始找。
在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的小伙伴很容易理解。
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
Next
End Sub
https://pan.baidu.com/s/1S0KiUnJnMIJwSfJHiaA0IA