这是奔跑的键盘侠的第130篇文章
作者|我是奔跑的键盘侠
来源|奔跑的键盘侠(ID:runningkeyboardhero)
转载请联系授权(微信ID:ctwott)
数组的应用,上一期讲了Array、UBound、LBound,这期我们继续将另外两个函数,Split函数和Filter函数。
1
Split函数
这个Split函数,软件中语法介绍是这样写的:返回基于 0 的一维数组,其中包含指定数目的子字符串。
简单一点讲,就是针对一维数组量身定制的函数。但是呢,它有一个很强大的功能,就是可以把一个变量拆分成一个数组,很cool有木有
软件语法介绍中的根据字母x把一个单词拆分成多部分,
MyString = Split("VBScriptXisXfun!", "x", -1, 1)
里面的参数后两个多数情况可以省略。
再举个其他的例子,比如我要把txt文本中的log日志,给分行提取出来:
Text = Plugin.File.ReadFileEx("C:\record_log.txt")
MessageBox Text
MyArray = Split(Text, "|")
For i=0 to UBound(MyArray)-1
TracePrint "第 " & i+1 &" 行文本内容为:"& MyArray(i)
Next
txt读取出来的结果会有个竖线分隔符,所以这里用弹窗输出一下看看:
txt中共4行内容,弹窗每行中间有个竖线分隔符,注意末尾的地方也有一个。换句话说,Text被竖线分隔符切割成了5段,只不过前面4段里有内容,最后一段为空。
so,我们循环下标i从0开始,剔除最后一行,就是UBound(MyArray)-1了。
不过呢,txt里面也经常会中间某行内容为空,我还是建议大家老老实实去判断一下元素值真假,挺有必要的
调试区的输出结果,我也贴一下:
具体的应用场景:
比如通讯录,或者配置表信息,代码复杂了,就需要把某些内容,存到本地文件中,运行代码的时候直接去调用。
这样的好处是:我们每次要补充通讯录信息,或者修改配置表参数时,直接去相应的本地文件里修改即可,而不是去源代码里面去改。。因为,一个不小心改到不应该改的内容,很容易出现什么意外神马的,那就呵呵呵呵了…………
于是,我们要把上述类似的信息,写到本地文件中。然后要去提取相应的信息,几乎都会用到Split函数。
比如一个通讯录:
可以直接Plugin.File.ReadFileEx函数读取所有内容,然后Split(Text, "|") 分割成一行一行的。接着,再Split(Text, ":") 分隔成姓名和号码。再通过判断语句,就找到了对应姓名的号码。
上一期我们有提到For Each i In的语法,可以替代For i=0 to UBound(MyArray)-1,这里为了大家熟悉数组的几个函数用法,暂时就这么用吧。我是更推荐试用Each In的语法,更好用
2
Filter函数
讲真,这个函数之前从未用过,自然也不知道该怎么用,网上介绍几乎木有。仅凭软件上语法介绍和案例,测试英文ok,中文出现一个未知bug,后来bug自己消失了,索性就来叨叨这个函数已知的用途吧。
先贴一下软件自带的语法示例:
MyArray(0) = "Sunday"
MyArray(1) = "Monday"
MyArray(2) = "Tuesday"
MyIndex = Filter(MyArray, "Mon")
要注意的是,最后的MyIndex也是一个数组哦,必须用下标才能读取出来。
说白了,就是过滤筛选一下,含有关键字的值,有点类似excel中的“查找所有”功能。
那要如何使用呢?
上一段讲的Split最后一段的最后一句,通过判断语句,找到对应的姓名号码,可以直接用Filter来实现。代码如下:
Text = Plugin.File.ReadFileEx("C:\Users\dell\Desktop\号码簿.txt")
MyArray = Split(Text, "|")
MyIndex = Filter(MyArray,"小明")
直接就能返回小明这行的信息,再提取出号码即可。But,有个问题,就像excel检索一下,包含“小明”二字的单元格,可能是干扰项,比如王小明、李小明、小明三,这些都不是我们想要的。
所以呢,这个Filter函数用于初步筛选是OK的,要想万无一失,还需要对筛选完的值进行二次校验,也就是再次使用判读语句,进行完全匹配。
隐隐的觉得Filter是一个非常牛逼的函数,因为Python中Filter是可以把过滤条件设置为函数名,比如写一个筛选偶数的函数,直接把“小明”替换成函数名,是可以直接过滤出数组中的偶数的。
可是按键精灵的Filter,调试了无数遍,很多Python的功能它并不适用。我知道它功能肯定是弱化了,已经失去了它该有的强大。不过也不排除潜在的隐藏功能没有被发掘,容我再好好思考一番,想到了再说吧