Excel 函数学习09-使用Excel函数从混合文本中取数值

如何使用函数公式从指定字符串中获取数据,包含了以下几种情况:

1 取固定位置和长度的数值
2 取字符串前面的数值
3 取字符串后面的数值
4 取字符串最大的数值
5 混合文本取数值
6 取字符串中身份证号
7 获取字符串中指定大小的数值
8 获取字符串中所有的数值的和
9 获取字符串中所有的数值
说明1:使用任何工具处理数据,发现数据的规律是前提必要条件。这些规律包含了数据的类型、位置、长度、序列、构成特点等,如果数据没有规律……那就只能请秘书了。当然,通常数据都是有规律的。用一句俗话来讲,生活从来不缺乏美,而缺乏一双发现美的眼睛,数据规律亦如此~

说明2:Excel解决问题的方式从来不是一种,请记得还有个快速填充(快捷键Ctrl+E);但快速填充并不是绝对可靠的,另外,和函数公式相比,它并没有构建结果和数据源之间的动态关联,也不支持横向填充使用。

1 取固定位置和长度的数值

如下图所示,需要在B列计算A列中的电话号码。



观察数据规律如下:

1)电话号码处在关键字“电话”后面。
2)电话号码都是7位。

公式如下:

=MID(A2,FIND("电话",A2)+2,7)

FIND("电话",A2)+2,查找关键字“电话”出现的位置,+2是扣掉“电话”本身,其结果也就是电话号码出现的位置。使用MID函数从该位置开始取7个字符,即为电话号码。

2 取字符串前面的数值

如下图所示,需要获取字符串开头的数值。


观察数据规律如下:

1)数值的位置在字符串的开头

2)数值长度不一致

公式如下:

=-LOOKUP(0,-LEFT(A2,ROW(1:11)))

-LEFT(A2,ROW(1:11)),从A2单元格源字符串的左侧,依次提取1到15个字符,得到如下所示的内存数组。

{"7";"72";"724";"7247";"72473";"724737";"7247371";"7247371李";"7247371李子"……}

使用一个减负运算,将文本数值转换为数值,文本转换为错误值。

然后使用LOOKUP的查询套路,获取最后出现的数值,也就是长度最大的数值。

最后再使用一个减负运算,将数据还原为正。

3 取字符串后面的数值

如下图所示,需要获取字符串右侧的数值。



观察目标数据规律如下:

1)出现在字符串的右侧
2)字符长度不一致

公式如下:

=-LOOKUP(0,-RIGHT(A2,ROW(1:15)))

类似上一题。

4 取字符串最大的数值

如下图所示,需要获取A列数据中的最大值



观察数据规律:

1)数值都是整数,最大不超过2位数。

最大值数组公式如下:

=MAX(IF(ISNUMBER(FIND(ROW(1:99),A2)),ROW(1:99)))

公式使用FIND函数判断1-99的序列号是否在A2单元格中存在,如果存在则返回1~99的序列号,最后使用MAX函数从中获取最大值。

但最小值并不能使用以下数组公式:

=MIN(IF(ISNUMBER(FIND(ROW(1:99),A2)),ROW(1:99)))
如果数值并非都是低长度的整数,又或者可能包含小数点呢?

最大值数组公式如下:

=MAX(IFERROR(--MID(A2,ROW(1:99),COLUMN(A:O)),""))

--MID(A2,ROW(1:99),COLUMN(A:O))部分,从A2单元格源字符串的第1、2、3……99字符的位置,分别提取1、2、3……直至15位长度的字符,使用减负运算,将文本数值转换为数值,纯文本转换为错误值。

然后使用IFERROR函数将错误值转换为假空,最后使用MAX函数从中获取最大值。

但最小值并不能使用以下数组公式:

=MIN(IFERROR(--MID(A2,ROW(1:99),COLUMN(A:O)),""))

5 混合文本取数值

如下图所示,需要按顺序从A列数据中获取首个电话号码和末个电话号码


观察数据规律如下:

1)位置不固定

2)长度均为7位

获取首个电话号码,数组公式:

=VLOOKUP(0,MID(A2,ROW(1:99),7){0,1},2,0)*

获取末尾电话号码,数组公式:

=VLOOKUP(0,MID(A2,ROW(1:99),7){0,1},2)*

和上一条VLOOKUP函数相比,VLOOKUP的匹配机制使用了模糊匹配。

当然也可以使用LOOKUP函数:

=-LOOKUP(0,-MID(A2,ROW(1:15),7))

关于LOOKUP和VLOOKUP返回结果的区别,也就是VLOOKUP返回首个匹配结果,VLOOKUP返回最后的匹配结果,
除了使用VLOOKUP函数和LOOKUP函数,也可以使用定位法:

=MID(A2,SMALL(IF(ISNUMBER(--MID(A2,ROW(1:50),7)),ROW(1:50)),COLUMN(A1)),7)

IF(ISNUMBER(--MID(A2,ROW(1:50),7)),ROW(1:$50)部分,MID函数从1、2、3……50的位置,分别提取7个字符,使用减负运算搭配ISNUMBER函数判断是否为数值,如果为数值,则返回序列号。

然后使用SMALL函数依次从小到大,也就是从前向后,获取位置序号,并使用MID函数提取结果。


6 取字符串中身份证号

如下图所示,需要获取A列中的身份证号。

观察数据规律如下:

1)身份证号是字符串中唯一的数值
2)身份证长度为18位

公式如下:

=MID(A2,MIN(FIND(ROW(1:10)-1,A2&1/17)),18)

MIN(FIND(ROW(1:10)-1,A2&1/17)部分,获取首次出现数值的位置。然后使用MID函数按位置获取18个字符长度的数据。

1/17意思就是拿1除17,其结果是一个包含了0-9数字的字符串。A2&1/17的作用,是防止FIND函数查找不到某个数值时,返回错误值。

注意:获取身份证并不能使用前面讲述的套路,比如MAX/VLOOKUP/LOOKUP等,这是因为函数公式能计算的数值最大精度是15位,超过15位的部分将被系统修改为0。这就是为什么我们之前的函数公式,截取数值长度时,均使用的15,而不是更大值。

当字符串中身份证不是首次出现的数值时,可以使用以下数组函数获取结果:

=MID(A2,MATCH(0,MID(A2,ROW(1:99),18)*0,0),18)

MID(A2,ROW(1:99),18)*0部分,从A2源字符串的1、2、3~~99个字符的位置,分别提取18个字符,然后乘以0,将数值转换为0,非数值转换为错误值。

使用MATCH函数获取获取首个0出现的位置,也就是首个连续18个数值字符出现的位置。

最后使用MID函数获取结果。

7 获取字符串中最小的数值

如下图所示,需要获取A列数据中最小的数值。


观察数据规律如下:

1)数值均处于单位个前面。

数组公式如下:

=MIN(IFERROR(--TEXT(MID(TEXT(MID(SUBSTITUTE("a"&A2,"个",REPT(" ",50)),ROW(1:199),15),),2,15),"0;-0;0"),""))

SUBSTITUTE(A2,"个",REPT(" ",99)),将单位个替换为99个空格。

MID(SUBSTITUTE(A2,"个",REPT(" ",50)),ROW(1:199),15),从1~199的位置,分别提取15位长度的字符。

TEXT(MID(SUBSTITUTE("a"&A2,"个",REPT(" ",50)),ROW(1:199),15),),如果MID函数计算结果为数值,则屏蔽为假空。

MID(TEXT(MID(SUBSTITUTE("a"&A2,"个",REPT(" ",50)),ROW(1:199),15),),2,15),从第2个位置,再分别提取15位长度的字符。为什么从第2个位置?数值的左侧必然为文本,从第2位取结果为数值的方才为完整的数值部分。

TEXT(MID(TEXT(MID(SUBSTITUTE("a"&A2,"个",REPT(" ",50)),ROW(1:199),15),),2,15),"0;-0;"),再使用一个TEXT函数屏蔽掉零值和文本。

最后使用IFERROR函数屏蔽掉错误值,使用MIN函数获取最小值,即为结果。

两个TEXT函数的应用是这个函数套路的精髓……

提取第N大的数值,比如第2大的数值:

=LARGE(IFERROR(--TEXT(MID(TEXT(MID(SUBSTITUTE(A2,"个",REPT(" ",50)),ROW(1:199),15),),2,15),"0;-0;0"),""),2)

8 获取字符串中所有字符的和

如下图所示,需要获取A列数据内所有数值的和。


9 获取字符串中所有的数值

B2数组公式:

=TRIM(TEXTJOIN(,TRUE,IFERROR(--MID(A2,ROW(1:99),1)," ")))

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343