专业编程基础技术教程

网站首页 > 基础教程 正文

Power Query中判断字符串中是否包含有字母的三种解决办法

ccvgpt 2025-04-06 14:12:11 基础教程 3 ℃

给出一个字符串列表,要求判断哪个字符串含有字母,哪个字符串不含字母:

Power Query中判断字符串中是否包含有字母的三种解决办法

使用Power Query来判断有两种基本方法:

  • 一种使用List类函数来判断:List.PositionOfAny
  • 一种使用Text类函数来判断:Text.PositionOfAny

当然也可逆向思维,我们删除数字后判断长度,也是一种方法,同样这个思路用List类函数与Text类函数都有对应的函数支持:

  • List.RemoveMatchingItems、List.Count
  • Text.Remove、Text.Length

List.PositionOfAny

这是一个返回对应字符位置的函数,返回负数是没有找到对应的项目,否者就是有对应的项目。

当然要把字符串转换成列表,然后才能查找:

我们用Text.ToList函数把字符串转成列表

= Text.ToList(L1{0})

然后查找字母位置:

= List.PositionOfAny(TL,{"a".."z","A".."Z"})

{"a".."z","A".."Z"}包含了所有的大小写英文字母,“12a3b4”中字母的位置是2,这里返回的是第一个字母的位置,位置是从0开始的。

整个字符串的判断这样来做:

= List.Transform(L1,

(x)=>x&"-"&(if List.PositionOfAny(Text.ToList(x),{"a".."z","A".."Z"})>0 then "有字母" else "无字母"))

用一个循环过程来逐个字符串进行判断。

Text.PositionOfAny

这个函数要比用列表类函数简单些,不需要转换成列表,直接进行位置判断:

= Text.PositionOfAny(L1{1},{"a".."z","A".."Z"})

L1{1}="1234",返回的结果是-1就表名这个字符串中没有字母

我们把这个函数替换到循环中:

= List.Transform(L1,

(x)=>x&"-"&(if Text.PositionOfAny(x,{"a".."z","A".."Z"})>0 then "有字母" else "无字母"))

这个公式要比第一种方法简洁很多。

最后我们用Text.Remove、Text.Length写一个公式来看看能否实现这个功能:

= List.Transform(L1,

(x)=>x&"-"&(if Text.Length(Text.Remove(x,{"0".."9"}))=0 then "无字母" else "有字母"))

这个公式看起来比第二个公式要复杂一些,但是这个公式应该更有效率,查找52次字母和删除10个数字比起来,肯定删除数字更有效率。

同样的一个问题,不同的思路解决问题的效率也会稍有不同,这个效率问题在数据量较小的时候,并不明显,当数据量很大的时候,效率不高的公式,就会拖慢整体的运行速度。

最近发表
标签列表