ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E文精选 > 函数与公式 > 对一个文本提取公式的一点理解

对一个文本提取公式的一点理解

作者:绿色风 分类: 时间:2022-08-17 浏览:140
楼主
toby08
一、问题的提出
A1单元格有这样一个文本:1230*007*93946*193
在B1:E1实现如下图效果

 
处理这种问题,我们有一个公式(也可以说是模板)可套用:
=TRIM(MID(SUBSTITUTE(A1,"*",REPT(" ",X)),{1,1+X,1+2X,1+3X},X))
这里X的取值选择15和14分别试验一下。

选择B1:E1单元格输入以下公式:
=TRIM(MID(SUBSTITUTE(A1,"*",REPT(" ",15)),{1,16,31,46},15)),并按Ctrl+Shift+Enter三键结束,结果如下

 
合乎要求

但如果把上面公式改为:
=TRIM(MID(SUBSTITUTE(A1,"*",REPT(" ",14)),{1,15,29,43},14))

 
出错了???
为什么1514只是一步之遥,却有截然不同的结果呢?
2楼
toby08
二、问题分析
=TRIM(MID(SUBSTITUTE(A1,"*",REPT(" ",X)),{1,1+X,1+2X,1+3X},X)) 这个公式神奇之处在哪里?
下面我们对这个公式进行剖析,看看它是如何工作的。
首先,SUBSTITUTE(A1,"*",REPT(" ",X))用多个空格替代*的过程必然产生了一些对过程有用但对结果无用的多余空格,所以最后我们仍需借用TRIM去掉这些空格。也可以这么说,公式的核心部分为红色的那一段。
为了方便讨论,跟开始A1文本内容类似,假设A1单元格有一文本,它被3个“*”这个“特殊符号”隔成4段。这里用M1代表第1个*之前的字符数,M2代表第1个*和第2个*之间的字符数,M3代表第2个*和第3个*之间的字符数,M4代表第3个*和第4个*之间的字符数。(当然,M1、M2、M3、M4是大于1的正整数,不然就没有讨论的意义了。)
SUBSTITUTE(A1,"*",REPT(" ",X)) 得到如下图(绿色框住的部分)结果

 
进行区间划分:
[1,M1]
[M1+X+1,M1+X+M2]
[M1+X+M2+X+1, M1+X+M2+X+M3]
[M1+X+M2+X+M3+X+1, M1+X+M2+X+M3+X+M4]

 
MID函数截取到的区间为:
[1,X]
[1+X,2X]
[1+2X,3X]
[1+3X,4X]

 
为了确保我们能正确获取到需要的文本块,则有如下关系:
1≤1≤M1≤X                                                                           …………①
1+X≤M1+X+1≤M1+X+M2≤2X                                                    …………②
1+2X≤M1+X+M2+X+1≤M1+X+M2+X+M3≤3X                                …………③
1+3X≤M1+X+M2+X+M3+X+1≤M1+X+M2+X+M3+X+M4≤4X              …………④

由①、②、③、④,有:X≥M1+ M2+ M3+ M4
3楼
toby08
三、小结
其实我们很容易就联想下去,对于n-1个分隔符“*”我们有:

 
至此,我们知道这个X也是有一个最小值的,不管怎样,X是不能比这个最小值更小了,否则就会出错。即:XMin=LEN(SUBSTITUTE(A1,"*",))
不过对于大多数情况,我们通常只要取X=99就够用了,而不必在意X到底能有多小(因为我们始终可以取到一个相对比较大的数,这样就很“保险”了)。
本文只是对一开始提出的公式的核心参数作一个探讨而已,可能还有不完善的地方,望大家不吝指教!
4楼
toby08
自己先补充说明两点:
一、为不失一般性,上述分析是在假定X为正整数的前提下进行的。因为若没有这一假定,对于1230*007*93946*193来说,用规划求解的方法可以求出一些比15还要小的小数出来,比如说X取13.666677154541、13.6667241210938、13.666725、13.6668076171875、13.666974609375这些特殊值时,仍可实现要求的。
二、X也是有最大值限制,即是说X不能也不必要非常大。
5楼
水星钓鱼
好贴。忍不住顶下。
6楼
laoyebin
确实好贴,好久木有函数了,复习一下
不过还是split函数方便,呵呵
7楼
herenqing
好贴。忍不住顶下。
8楼
yzcyzc1023
谢谢分享。
9楼
gouweicao78
没曾想toby08兄先发此帖了,而且对X的值算这么精确,呵呵。我直接用LEN来代替了,省得记:

【公式解析系列】之数据按分隔符“分列”函数解法 http://www.exceltip.net/thread-2188-1-1.html
10楼
xiongkehua2008
這個公式其實在實際操作會經常用到,以前只知用,原理沒有深究過,看過此貼印象列深了...
11楼
monvzhilei
风兄居然也来参战了。
12楼
杏花雨V翟
XMin=LEN(SUBSTITUTE(A1,"*",))

这个计算很精彩啊
13楼
wangqilong1980
谢谢分享,收藏学习
14楼
stevehai


免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap