在两万条数据中找特定的手机号,第2种方法居然只用1秒……这个神器太牛X!
本文作者:农夫、小爽
本文审核:小爽
本文编辑:雅梨子、竺兰
小伙伴们,大家好,我是农夫,专治疑难「数」的农夫;她是小爽,注定要站在 Excel 顶端的大佬~
这里有一份包含两万条手机号的数据,我们想从这些手机号里筛选出包含 AAAABB 型的靓号(从第 2~6 位开始),分析一下这些靓号的消费习惯等特征,方便后面进行精准推广,这应该怎么做呢?
之前的文章中我们讲过其中两种方法(余数判断法和拆分判断法),忘了的同学点这里复习↓↓↓
用这两种方法识别AAAABB型手机号,我成了同事眼中的Excel大神~
M 函数法
❶ AAAABB 所有可能的结果
= List.TransformMany(List.Transform({1..9},each _*1111),each List.Transform({1..9},each _*11),(x,y)=>Text.From(x)&Text.From(y))= List.TransformMany(List.Transform({1..9},each _*1111),each List.Transform({1..9},each _*11),(x,y)=>Text.From(x)&Text.From(y))List.Transform({1..9},each _*1111),目的是生成 1111~9999List.Transform({1..9},each _*11),目的是生成 11~99=List.TransformMany(列表 1,each 列表 2,(x,y)=>返回方式)=List.TransformMany({1..3},each {3},(x,y)=>x*y)= List.TransformMany(列表 1,each 列表 2,(x,y)=>返回方式)= List.TransformMany( List.Transform({1..9},each _*1111),each List.Transform({1..9},each _*11),(x,y)=>Text.From(x)&Text.From(y))❷ 判断符合条件的手机号
Text.Middle(Text.From([电话]),1)Text.Middle(Text.From([电话]),1),=Table.AddColumn(源,"结果",each Text.Middle(Text.From([电话]),1))= Table.AddColumn(源, "结果", each List.MatchesAny(可能的结果,(x)=> Text.Contains(Text.Middle(Text.From([电话]),1),x)))Text.Contains(文本,字符串)=List.MatchesAny(列表,(x)=> 判断条件)=List.MatchesAny(可能的结果,(x)=>判断条件)Text.Contains(Text.Middle(Text.From(【电话】),1),x) ——x 代表每一个「可能的结果」中列表的值。
Text.Contains(去掉第一位的手机号,x) ——去掉第一位的手机号是否包含可能的结果中的一个,如果其中有一个为 TRUE,由于 List.MatchesAny 只要存在一个,就返回 TRUE。
=List.MatchesAny(可能的结果,(x)=>判断条件)=List.MatchesAny(可能的结果,(x)=>Text.Contains(Text.Middle(Text.From([电话]),1),x))= Table.AddColumn(源, "结果", each List.MatchesAny(可能的结果,(x)=> Text.Contains(Text.Middle(Text.From([电话]),1),x)))❸ 筛选符合条件的部分
=P_REG_FIND(A2,"(\d)\1{2}(\d)\2{1}")=P_REG_FIND(目标单元格,"正则表达式")=P_REG_FIND(A2,"(\d)\1{3}(\d)\2{1}") "(\d)\1{3}(\d)\2{1}"\d 代表的是数字,等价于 0-9。——相当于 0 到 9 的任意一个数字 ()代表一个子表达式的开始和结束位置,即将匹配到的数字单独分为一组,以便后面直接调用,有几个小括号就分为几组;——(\d)\1{3}(\d)\2{1},这里有两组 \n 代表将第 n 组的匹配模式进行复制,如\1 就指复制第一组的匹配模式;——(\d)\1{3}(\d)\2{1},\1 复制前面的一组(第 1 组),也就是前面的(\d)
(\d)——可以是 0 到 9 的任意一个数字。
\1 ——复制前面一组,(\d),可以是 0 到 9 的任意一个数字。
{3} ——将前面的\1 的数字重复三次,加上前面一个就是连续的 4 位数字,比如上一个是 2,再重复 3 次 222。
(\d)——可以是 0 到 9 的任意一个数字。
\2{1}——复制前面一组,(\d),可以是 0 到 9 的任意一个数字,然后再重复 1 次,比如上一个是 1,再重复 1 次 1,与上一个连起来就是 11。
小课堂:你还不知道正则表达式?怪不得效率那么低!
知识回顾
逐一筛选法:
❶ 利用 List.TransformMany 遍历出所有可能的结果
❷ 利用 Text.Contains 进行判断是否包含
❸ 筛选出符合条件的结果
正则表达式: