我在各个网上面收集了很多试题,里面肯定有重复的,我想把重复的删除了。如果用论坛上面删除重复行的办法必须每一行完全一样才能删除。但是每个网站的排版又不尽相同,里面标点符号可能不同,发布的格式也有区别。
举例子:
315、发现火灾,应拨打哪个电话报警?(119)
402、发现火灾,应拨打哪个电话报警?(119)
412、发现火灾,应拨打哪个电话报警?(119)
414、发现火灾,应拨打哪个电话报警?(119)
1113、发现火灾,应拨打哪个电话报警?(119)
706、饮酒后驾驶机动车的,一次记(12)分。
1674、饮酒后驾驶机动车的,一次记___分。(12)
532、水上遇险求救电话号是(12395)。
326、水上遇险求救电话号是。(12395)
1268、水上遇险求救电话号是()(12395)
85、水上遇险求救电话号是(12395)
处理后就得到:
315、发现火灾,应拨打哪个电话报警?(119)
706、饮酒后驾驶机动车的,一次记(12)分。
532、水上遇险求救电话号是(12395)。
现在需要对以上合并出来的txt文档进行出来,最终只留下唯一的一行。(注:以上只是举例,真正复制回来试题的可能有上千条。)
http://www.bathome.net/viewthread.php?tid=29652&highlight=%CF%E0%CB%C6
和这个贴子相似,
以下为要处理的文件的一部分
最后引用crlf版主的代码了,函数部分是引用了别人的在原帖中有,运行用了2天时间,最后结果是4200行得出了1400行,与我手动排序后去得结果1700行,相差了300多行。
这个办法太慢,慎用- Const input = "输入.txt"
- Const output = "输出.txt"
- Const isDebug = False
- Const length = 4
-
- t=Timer
-
- Set fso = CreateObject("Scripting.FileSystemObject")
- Set ts = fso.OpenTextFile(input,1)
-
- ar = Split(ts.ReadAll,vbCrLf)
-
- For i=UBound(ar) To 1 Step -1
- If Not test(ar,i) Then ar(i)=""
- Next
-
- Set ts = fso.CreateTextFile(output,1)
-
- For Each a In ar
- If Len(a) Then ts.WriteLine a
- Next
-
- If isDebug Then ts.WriteLine timer-t
-
- Function test(ar,i)
- Dim j,length
-
- For j=0 To i-1
- length = Len(ar(i))
- If Len(ar(j))>Len(ar(i)) Then length = Len(ar(j))
- If GetLevenshteinDistince(ar(i), ar(j)) > Sin(2/(Sqr(length)+5)) Then
- test = False
- Exit Function
- End If
- Next
- test = True
- End Function
-
- Function GetLevenshteinDistince(str1, str2) '函数引用自:http://bbs.bathome.net/thread-27991-1-1.html
- Dim x, y, A, B, C, K
- Dim l1,l2
- Dim Matrix()
- l1 = l2 = 0
- If Len(str2)>=length Then l1=Len(str2)-length+1
- If Len(str1)>=length Then l2=Len(str1)-length+1
-
- ReDim Matrix(l2, l1)
-
- '初始化第一行和第一列
- For x = 0 To UBound(Matrix, 1)
- Matrix(x, 0) = x
- Next
- For y = 0 To UBound(Matrix, 2)
- Matrix(0, y) = y
- Next
-
- '填充矩阵
- For x = 1 To UBound(Matrix, 1)
- For y = 1 To UBound(Matrix, 2)
- If (Mid(str1, Matrix(0, y), 4) = Mid(str2, Matrix(x, 0), 4)) Then
- C = Matrix(x -1 ,y - 1)
- Else
- C = Matrix(x -1 ,y - 1) + 1
- End If
-
- A = Matrix(x - 1, y) + 1
- B = Matrix(x, y - 1) + 1
-
- If (A =< B and A =< C) Then Matrix(x, y) = A
- If (B =< C and B =< A) Then Matrix(x, y) = B
- If (C =< A and C =< B) Then Matrix(x, y) = C
- Next
- Next
-
- '计算 LD 值
- If (Len(str1) > Len(str2)) Then
- K = Len(str1)-length+1
- Else
- K = Len(str2)-length+1
- End If
-
- GetLevenshteinDistince = 1 - (Matrix(l2, l1) / K)
- End Function
复制代码
|