欢迎转发和点一下“在看”,文末留言互动!
置顶公众号或设为星标及时接收更新不迷路
小伙伴们好,今天和大家分享一道文本拆分题目。在低版本环境下,文本字符串的拆分通常需要一组函数嵌套使用才能完成,而在高版本的环境下可能就要使用TEXTSPLIT或者正则了。
如果你们不能使用高版本函数,那就要牢记文本拆分的套路组合!
题目是这样的:
题目要求将源数据中方剂拆分成右侧的样子。还好已经有无数的大佬们为我们总结好了在低版本环境下处理这类问题的经典套路。
01
经典的文本数据拆分套路
先处理药品名称。
在单元格D2中输入下列公式,三键确认后向下拖曳即可。
=INDEX(A$2:A$3,SMALL(IF((LEN(B$2:B$3)-LEN(SUBSTITUTE(B$2:B$3,"、",""))+1)<COLUMN($A:$Q),100,ROW(B$2:B$3)),ROW(A1))-1)
简单介绍一下这条公式的逻辑思路。
LEN(B$2:B$3)-LEN(SUBSTITUTE(B$2:B$3,"、",""))+1
这组公式的作用是计算方剂中药品的数量。其原理是,将源数据中的分隔符替换为空后,再用替换前的字符串长度减去替换后的长度,再加上1,就是药品的数量值。
这是一个数学逻辑。你细品品!
IF((LEN(B$2:B$3)-LEN(SUBSTITUTE(B$2:B$3,"、",""))+1)<COLUMN($A:$Q),100,ROW(B$2:B$3))
IF函数做一个逻辑判断。满足条件的返回一个极大值100,不满足的返回对应的行号。
IF函数的结果是一个2行17列的内存数组,大概是下面这个样子。
SMALL(IF((LEN(B$2:B$3)-LEN(SUBSTITUTE(B$2:B$3,"、",""))+1)<COLUMN($A:$Q),100,ROW(B$2:B$3)),ROW(A1))
SMALL函数依次提取小值,作为INDEX函数的第二参数。
INDEX(A$2:A$3,SMALL(IF((LEN(B$2:B$3)-LEN(SUBSTITUTE(B$2:B$3,"、",""))+1)<COLUMN($A:$Q),100,ROW(B$2:B$3)),ROW(A1))-1)
最后INDEX函数返回正确答案。
02
SUBSTITUTE函数经典套路,COUNTIF函数是看点
再来看药品名。
在单元格E2中输入下列公式,三键确认并向下拖曳即可。
=MID(TRIM(MID(SUBSTITUTE(VLOOKUP(D2,A$2:B$4,2,),"、",REPT(" ",99)),COUNTIF($D$2:D2,D2)*99-98,99)),1,2)
这条公式用到了SUBSTITUTE函数的经典套路,以及COUNTIF函数的一个小技巧。
COUNTIF($D$2:D2,D2)
随着公式向下拖曳,COUNTIF函数会依次返回1、2、3、4、5和1、2、3。
TRIM(MID(SUBSTITUTE(VLOOKUP(D2,A$2:B$4,2,),"、",REPT(" ",99)),COUNTIF($D$2:D2,D2)*99-98,99))
MID函数的经典套路。利用VLOOKUP函数抓取到B列中的方剂组成,并提取方剂的每个成分。
MID(TRIM(MID(SUBSTITUTE(VLOOKUP(D2,A$2:B$4,2,),"、",REPT(" ",99)),COUNTIF($D$2:D2,D2)*99-98,99)),1,2)
最后用MID函数提取药材名。
这里正巧每个药材都是双字节名字,所以就简单使用MID函数提取了。
实际上会有更复杂的情况,比如三字名等等,这时就需要首先确定数字位置,之后再提取名字。过程并不复杂,但书写起来太冗长了,不在这里展示了。
03
同样方法处理数量
最后提取数量。
这条公式和第二个公式相同的,不用再解释了。
本期内容练习文件提取方式:
链接: https://pan.baidu.com/s/1V0aU81J-5xfJM6INRb95Pw?pwd=ng1r 提取码: ng1r
-END-
长按下方二维码关注EXCEL应用之家
面对EXCEL操作问题时不再迷茫无助
我就知道你“在看”