梁山集团的生意越做越大,客户已经遍布全国各地,这天寨主宋江突然想了解一下全国每个大城市(直辖市、地级市级别)的客户分布情况,以便调动资源去开疆拓土,于是这个活自然就落在神算子蒋敬的头上。
蒋敬拿到工作指令,打开系统一看,顿时傻眼了:系统内虽然有每个客户的地址信息,但是信息不规整,想快速把活干好只怕要花点时间;请看下图:

在上图中,“客户地址”列的信息毫无规律:城市名称有在字段前面的(比如上海)、有在中间的(比如包头市)、还有城市名称中不含“市”的(比如哈尔滨);
数据信息没有规律,就不方便一下子把城市名称提取过来,于是解决方案如下图所示:

1、准备全国所有的直辖市、地级市城市名单;
这一步需要到网上去找资料,全国城市名单不属于敏感机密信息,很好获取,不再赘述。
2、把准备好的城市名单去掉后缀的“市”,并依次存放在D列、E列…;
注意:网上查到的城市名单一般都包含“市”,比如“北京市”,为了适配客户地址中的城市不含“市”这个条件,需要把查到的城市名单再略微加工一下。
3、在D2单元格输入如下函数,并把函数填充到最右侧和最下方;
=IF(ISNUMBER(FIND(D$1,$B2)),D$1,"")
上述函数的意思是:如果D1单元格的城市名称在B2中,就输出D1单元格的内容,否则就输出空值。
4、在C2单元格输入如下函数,并把函数填充到最下方;
=TEXTJOIN("",TRUE,D2:KN2)
上述函数的意思是:把D2到KN2单元格的内容连接在一起;也就是实现了把城市名称提取过来的目的。
注意:TEXTJOIN函数是OFFICE2019版本及以上才有的,如果你的版本较低,那就比较麻烦了,因为这里的解决问题思路是:把D2到KN2单元格的内容连接在一起;在第3步中我们得到了一行“只有某个单元格有城市名称,而其他单元格都是空值”,这样的一行数据如果在低版本中做连接,除了用&符号和CONCAT函数外,就只能使用“一个更复杂的函数”了,请看下图:

在低版本的Excel中,用&符号和CONCAT函数做连接,就几个数据还行,但是这里从D2到KN2有几百列!只好使用更烧脑的函数:
=INDEX(D2:KN2,1,MATCH(TRUE,ISNUMBER(1/LEN(D2:KN2)),0))
上述函数解释如下:
A、用len函数分别计算D2到KN2每个单元格的字符长度;这时候会得到一个内存数组{0,0,0,…,2,…,0,0,0};
B、用1除以上述内存数组;这时候会得到一个新的内存数组{#DIV/0!,#DIV/0!,#DIV/0!,…,1/2,…,#DIV/0!,#DIV/0!,#DIV/0!};
C、用isnumber函数判断上述内存数组是不是数字;这时候又会得到一个新的内存数组{FALSE,FALSE,FALSE,…,TRUE,…,FALSE,FALSE,FALSE};
D、用match函数计算TRUE在上述内存数组中的位置;这时候会输出28这个数字;
E、把28这个数字作为参数传递给最外层的index函数,即可把“包头”这个城市名称提取过来了。
看完上述解释,想必大家都应该有个冲动:赶紧去升级Excel版本!
写在最后:本文的主要目的不是讲函数的用法,更不是让大家升级Excel版本,是想让大家在日常工作中注意“标准化数据信息”,比如地址就老老实实按照:**省(自治区)**市**区这样的标准格式维护进系统,好方便大家都能快速的调用。
“数据小哥哥”公众号,以后将不定时更新我在数据分析领域的见解,觉得内容有用,请点赞+收藏慢慢看,需要各种数据模版的,可在公众号后台回复关键词:数据模板,即可免费领取。
夜雨聆风