“ 有的时候,我们会得到一些嵌有数值的文本信息。为了处理这些信息,我们不得不要绞尽脑汁提取其中的数值。若格式统一,那还好办,若格式千奇百怪……
比如这样:
是不是瞬间有一万匹草泥马飘过……
构思想法
很显然,这一组信息并没有明显的规律。因此,想要提取出其中的数字,必须按照两步走:
1. 找到第一个数字字符在字符串中的位置
2. 找出数字字符的长度
找出第一个数字字符的位置
找到第一个数字字符的位置,换句话来形容的话,就是要找到:字符为0~9,在整个字符串中的最小位置。
这里我先定义了两个区域分别为IstNumbers——包含0~9这10个字符,以及IstDigits——包含0~9以及小数点和逗号。稍后,火箭君会详细解释一下,这样定义的具体考虑。
在C4单元格键入公式:
=MIN(IFERROR(FIND(lstNumbers,B4),""))
然后按下CTRL+SHIFT+Enter,完成数组公式的输入。
FIND(IstNumbers,B4) 部分
这个部分公式,是逐一计算0~9这些数字在B4文本中出现的位置。一旦在文本中找到这个数字,则直接返回一个字符位置;否则返回一个错误值。以B4单元格749000 RMB为例,其返回的数组为:
{4;#VALUE!;#VALUE!;#VALUE!;2;#VALUE!;#VALUE!;1;#VALUE!;3}
意为0出现在第四个位置,4出现在第二个位置,7出现在第一个位置,9出现在第三个位置,其他数字没有出现。
IFERROR(...,"") 部分
这个函数,则将刚才找到的错误值全部转换为空值,返回值变为: {4;"";"";"";2;"";"";1;"";3}
{=MIN(...)}部分
这个函数则返回了,刚才处理过的数组中最小的值,也就是1。这也就是数字字符的起始位置。 当然,由于考虑到我们要比对寻找多个字符,因此用数组计算方式才正确。
找到数字字符的长度
由于考虑到原数据中,还存在有逗号、小数点这样的表达形式,因此火箭君在上文中定义了IstDigits这个区域。
在D4中键入公式:
=SUMPRODUCT(COUNTIF(lstDigits,MID(B4,ROW($A$1:$A$200),1)))
COUNTIF(lstDigits, MID(…)) 部分
检查B4文本中每一字符在IstDigits中是否出现,是为1,否为0。而整个B4文本总长不超过200个字符。因此返回值为:
{1;1;1;1;1;1;0;0;0;0;0;0;0;…}
也就是B4中,仅有前六位为数字或者逗号、小数点。
SUMPRODUCT(…) 部分
由于上一步的返回值是一个数组,因此使用sumproduct进行求和。在这里返回为6。
数字抓取的结果
仍然有两种格式无法被上述公式所认可,不知道小伙伴你,会有什么想法呢?也欢迎在火箭君的公众号后台留言,说说你的处理想法。
当然,如果你对具体公式还有疑问,可以在公众号里回复“数字抓取”,我将推送给你我的工作表!