Tess4J识别表格中的数字_Tess4J识别表格中的数字


上一篇我们提到了文本、字母/数字分离的初级方法,但因为没法分离字母与数字,所以这里给出两种复杂的函数来进行字母与数字的分离。

老规矩,先上图:

Tess4J识别表格中的数字_原始数据_02

图1 两个分离函数效果示意图1


第一个函数

=MID(A3,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A3&"0123456789")),LEN(A3))

乍一看很复杂,我们来分解一下:

最内层,FIND函数,在原始数据中分别找数字0-9,但为了避免找不到的情况,所以在原始数据后面加上了字符串0123456789。
这个FIND函数返回的就是分别找到的数字在新的字符串的第几位的这个“几”。
之后呢?有一个MIN函数,那就是找到以上这些“几”中最小的那个,那么也就是原始字符串中第一个出现的数字所在的位数。
然后呢?知道了第一个数字所在的位数那就好办了,用MID函数,直接从这个位数开始取整个字符串的字符个数就可以得到数字串了。
当然,这里因为是取了整个字符串字符个数,所以要求数字要在最后边,数字后边不能有其他字符,不然也会顺带着提取出来了。

总结一下:

这个函数因为较复杂,也就只推荐用于提取数字了,字母就不管了。而且要求数字在后边,所以不太推荐,看不大懂也没关系,我们继续下一个函数。

第二个函数

=RIGHT(A11,COUNT(VALUE(MID(A11,ROW($1:$20),1))))

同样的我们来分解一下:

最内层MID函数,三个参数,第一个参数是原始字符串A11,第二个参数是ROW($1:$20),即一个[1-20]的数组,第三个参数是1,理解下就是,将原始字符串A11的每个字符全部分隔开来,得到全部单独的字符组成的数组。举例来说就是将一个整体字符串“EXCEL321”拆分为数组[E,X,C,E,L,3,2,1]。
其次,外面套一个VALUE函数,该函数的作用是“将代表数值的字符串转换为字符”,那么举例,将以上得到的数组[E,X,C,E,L,3,2,1]转换为数值,结果如下图所示:


Tess4J识别表格中的数字_字符串_03

图2 VALUE函数转换结果

那么,再外一层函数是COUNT,即计算上面得出的[#VALUE!,#VALUE!,#VALUE!,#VALUE!,#VALUE!,3,2,1]这个数组中数字的个数,有3,2,1,三个数字,所以COUNT函数得出的结果是3。
那么接下来就简单了,得出了数字个数之后,用LEFT或者RIGHT函数就可以提取出来数字了。数字在前面就用LEFT,在右边就用RIGHT。

总结一下:

这个函数可以明确得出数字的个数,数字在前面或者后面均可。不过要注意的一点是,由于最内层MID函数中采用的是单独分离出每个字符,所以字符个数要是超过了20,要调整参数ROW($1:$20),改为更大的值即可。


有想法的同学到这里会不会突发奇想,假设数字在中间呢?例如:

陌上123dawsondx

这个数字就在中间,那么,是不是可以将我们上面两个函数结合起来呢?毕竟第一个函数是MID解决的,缺少计算数字个数的方法,而我们第二个函数恰好就是可以计算数字个数的。

实践出真知,我们来尝试一下:

第一个函数是=MID(A3,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A3&"0123456789")),LEN(A3))

第二个函数是=RIGHT(A11,COUNT(VALUE(MID(A11,ROW($1:$20),1)))),
其中计算数字个数的部分是COUNT(VALUE(MID(A11,ROW($1:$20),1)))

我们将第二个函数中计算数字个数的部分替换掉第一个函数的最后一个部分LEN(A3),就可以得到函数:

=MID(A18,MIN(FIND({0,1,2,3,4,5,6,7,8,9},A18&"0123456789")),COUNT(VALUE(MID(A11,ROW($1:$20),1))))


Tess4J识别表格中的数字_字符串_04

图3 突发奇想的函数

事实证明是完全可行的,对第一个函数和第二个函数进行融合,得出一个适用条件更广的公式。


好了,这篇就讲到这里了,主要是思路,大家有没有收获呢?另外,这期与上一期的实例源文件已经放到了我的知识星球中,快进去领取源文件练习吧。

我正在「Excel进阶史」和朋友们讨论有趣的话题,你⼀起来吧?


Excel中文本、字母、数字分离高级方法

Tess4J识别表格中的数字_excel文本转数字_05