大家好,我是公众号3分钟学堂的郭立员
前言
写脚本的时候会遇到这种问题,就是界面上有重复(相似)的内容,需要循环执行,不过不能重复,比如以下的例子。
上面这几个例子在写脚本的时候,如果不做排除重复的处理,就会针对一个内容反反复复做无效操作。
为了避免这种情况的发生,会用文本记录已经操作的内容,然后执行未操作的部分。
一、原理讲解
无论是自动聊天还是数据采集,都是要把得到数据进行一个是否重复的判断。
这里的数据通常来说是字符串,那么我选用文本作为容器存储这些数据,当有新的数据时,先和文本中的原有数据进行逐个比较,看看是否有一样的,如果全部比较之后都没有一样的,就把新数据存入到文本当中。
二、操作思路
(1)存储形式
①按行存储,就是每一个数据放一行,有新数据就新增一行
②使用分隔符把每一个数据分开
③、使用json格式存储
实际应用时每种形式都可以的,看自己的喜好。
(2)不同形式数据的读取
①、按行存储形式的读取
Dim arr = file.readlines("/sdcard/pictures/记录.txt")
For i = 1 To Len(arr)
TracePrint arr[i]
Next
②、分隔符存储形式的读取
Dim path = "/sdcard/pictures/记录.txt"
Dim str = file.read(path)
Dim arr = split(str,"----")
For i = 1 To Len(arr)
TracePrint arr[i]
Next
③、json存储格式的读取
Dim path = "/sdcard/pictures/记录.txt"
Dim str = file.read(path)
TracePrint str
Dim arr = encode.JsonToTable(str)
For i = 1 To Len(arr)
TracePrint arr[i]
Next
上面几种形式本质上就是两种形式,文中的一行和多行数据形式,读取之后经过处理会把数据变成数组,然后就可以遍历数据了。
后续基本就是对于数组内容的比较,当然也有一种方式就是从文本里面一行一行的读取,相较于一次性读取,这种方法比较耗时。
(3)数据比较
由于从文本读取的数据,最后都会变成数组形式,那么我们做数据比较基本就是看新的数据在数组里面是否存储。
以下例子为了方便,直接定义了一个数组
Dim data = "郭立员"
Dim arr = {"3分钟学堂","郭立员","微信xiaomu86119"}
For i = 1 To Len(arr)
If arr[i] = data Then
TracePrint "存在这个数据"
End If
Next
遍历数据进行判断的过程中,如果出现一样的数据, 就可以结束跳出循环了,如果循环结束后,还没有执行跳出循环,那说明新的数据在数组中没有一样的。
Dim data = "QQ:453485278"
Dim arr = {"3分钟学堂","郭立员","微信xiaomu86119"}
For i = 1 To Len(arr)
If arr[i] = data Then
TracePrint "存在这个数据"
exit for
End If
If i = Len(arr) Then
TracePrint "这是一个新的数据,没有重复的"
End If
Next
比较部分数据,比如比较数组的前3个数据或者比较数组的后3个数据。
这种方式的应用场景:比如只想比较最近增加的几个数据是否有重复。
前3个比较方法,这个数量可以自己设置。
Dim data = "QQ:453485278"
Dim arr = {"3分钟学堂","郭立员","微信xiaomu86119"}
Dim n
If len(arr) >= 3 Then
n = 3
Else
n = len(arr)
End If
For i = 1 To n
If arr[i] = data Then
TracePrint "存在这个数据"
End If
If i = Len(arr) Then
TracePrint "这是一个新的数据,没有重复的"
End If
Next
后3个比较的方法:
Dim data = "QQ:453485278"
Dim arr = {"3分钟学堂","郭立员","微信xiaomu86119"}
Dim n
If len(arr) >= 3 Then
n = len(arr)-2
Else
n = 1
End If
For i = n To len(arr)
If arr[i] = data Then
TracePrint "存在这个数据"
End If
If i = Len(arr) Then
TracePrint "这是一个新的数据,没有重复的"
End If
Next
上面两段代码中都做了数组下标范围的判断,防止超出范围引起脚本报错。
(4)新数据的写入
当判断出是新数据后,需要把它写入到文本当中,这里我只以文本多行存储为例写一下代码。
第一步先判断用来当做记录的文本是否存在,如果文本不存在的话,新建一个文本,把数据直接写入到文本中,由于是要写多行,这里我会在数据后面拼接一个换行符 \n ,目的是后续使用追加命令写入文本。
Dim path = "/sdcard/pictures/记录.txt"
Dim data = "QQ:453485278"
If Dir.Exist(path) = 0 Then
file.Write(path,data&"\n")
End If
接下来把上面的判断重复代码写上,并在确认是新数据后使用追加命令写入到文本中。
Dim path = "/sdcard/pictures/记录.txt"
Dim data = "QQ:453485278"
If Dir.Exist(path) = 0 Then
file.Write(path,data&"\n")
End If
Dim arr = file.readlines(path)
For i = 1 To Len(arr)
If arr[i] = data Then
TracePrint "存在这个数据"
Exit For
End If
If i = Len(arr) Then
TracePrint "这是一个新的数据,没有重复的"
file.Append(path,data&"\n")
End If
Next
最后封装成函数:
函数的参数:
①、要写入的数据 data [必需参数]
②、文本路径 [非必需参数]
函数的返回值:
写入成功是True,重复数据写入失败是False
Dim data = "微信xiaomu86119"
TracePrint 写入文本(data)
Function 写入文本(data)
Dim path = "/sdcard/pictures/记录.txt"
If Dir.Exist(path) = 0 Then
file.Write(path,data&"\n")
End If
Dim arr = file.readlines(path)
For i = 1 To Len(arr)
If arr[i] = data Then
TracePrint "存在这个数据"
写入文本 = False
Exit For
End If
If i = Len(arr) Then
TracePrint "这是一个新的数据,没有重复的"
file.Append path, data & "\n"
写入文本 = True
End If
Next
End Function