按键精灵代码模板非重复的文本记录
大家好,我是公众号3分钟学堂的郭立员~
昨天群友问我能不能写一个模板,模板的功能是实现记录名字,如果文本里面有这个名字就不写入,如果没有就写入。
这模板可以写,想用的朋友直接拉到文章底部,直复制粘贴代码就可以用,想了解一下过程,可以看看文章内容。
在写脚本之前先要有个大概思路,知道脚本的难度在哪里。
我在写这个模板之前会在脑子里面思考这么几个问题:
①这个代码的核心部分是什么,写入文本命令
②难点是什么?比对文本是否存在
③解决难点的思路,即如何实现比对文本,判断是否存在。
这个问题也是有固定的解决方法,完全匹配就是a=b的形式,也就是判断两个内容是不是相等,部分匹配是用查找命令,比如instr(1,a,b)>0,这就是在a里面查找b是否存在。
这两种方式要选择哪种呢?
第一种:完全匹配,要把文本中存入的名字,一个个提取出来,然后和需要写入的名字对比,比对次数比较多。
第二种:部分匹配,把文本里面全部名称一次性读取出来,然后用查找命令去查找,对于代码来说用一次查找就可以完成匹配的判断,同样它也存在缺点,就是包含关系会误判,比如我叫郭立员,现在要写入一个叫郭立的名字,从字面上看这很明显是两个人名,但是对于代码来说,在"郭立员"三个字中查找"郭立"也是找得到的,造成错误判断。
分析利弊,第一种方法稍微麻烦,第二种方法准确率欠佳,两种都可以用,我个人觉得第一种稍微好一些。
④假定选择了第一种方法,要怎么实现逐个比对呢?
先用readlines命令读取全部文本内容并存入数组,接下来遍历数组内容,没遍历出一个就和新内容进行比对,当数组中所有内容比对完,还没有一样的,就说明新内容不存在重复,可以直接写入到文本里面。
假如数组遍历的过程中,某一个内容比对完是重复的,就可以直接跳出循环结束遍历数组的操作,新内容不需要写入文本。
这里有没有难点呢?有的~
就是你怎么知道遍历数组结束是全部遍历完还是中间跳出循环结束遍历。 For i = 0 To UBOUND(arr) If arr(i) = 新内容 Then TracePrint "跳出循环" Exit For End If If i = UBOUND(arr) Then TracePrint "遍历完成" End If Next
我想到的解决方法是,i = UBOUND(arr) 的判断,就是看计次变量是不是数组最大下标,如果这个判断成立,说明循环过程中未出现跳出循环的操作,整个循环全部完成。
想好解决比对问题这个难度,就可以开始写代码了,加上写入文本里面就可以。 Dim path="/sdcard/pictures/文本.txt" Dim content="2" TracePrint WriteTxt(path,content) Function WriteTxt(path,content) Dim arr If Dir.Exist(path) = 0 Then TracePrint "首次写入" file.write path, content WriteTxt=true Else arr = file.readlines(path) If Len(arr) = 0 Then TracePrint "首次写入" file.write path, content WriteTxt=true End If For i = 0 To UBOUND(arr) If arr(i) = content Then TracePrint "已经存在" WriteTxt=false Exit For End If If i = UBOUND(arr) Then TracePrint "不存在" file.writeline path, 1, content WriteTxt=true End If Next End If End Function
这个完整的代码,我已经封装成函数,可以直接用了。
照着脚本代码,我说几个细节部分:
(1)判断了存储文本的这个文件是否存在
(2)判断存储文本初始状态是不是空
(3)首次写入,可以和新建文本一块完成
*(4)给函数加上布尔值的返回值,方便利用返回值的二次开发,这一点我在前面加了星标,意思是它很重要,我们写脚本通常不是孤立的一个功能,可能是多个功能放到一起,作为一个模板要考虑到能和其他代码结合。
注:由于file插件的兼容性问题,win7系统请在手机上直接看文本内容,不要用电脑查看。
本期内容就这些,感兴趣的朋友点个赞。