记事本文件去除重复行问题
本帖最后由 qqgghh1 于 2009-7-29 08:49 编辑有一记事本文件(某程序每次运行会生成一行信息,里面有4个返回值,用","分开)
A1,A2,A3,A4
B1,B2,B3,B4
C1,C2,C3,C4
D1,D2,D3,D4
E1,E2,E3,E4
F1,F2,F3,F4
.
.
现在需要实现:当存在某一个行的第二个值(A2,B2......)与其它行的第二个值有重复,则删除该行。取最后一次更新的行。
向大大们请教,如何实现。不胜感激,奉献金币若干! 1# qqgghh1
之前有搜索过,有关清除一个数组中的重复项,没有看懂,不知道能否解决我的问题。
http://www.autoitx.com/forum.php?mod=viewthread&tid=5591&highlight=%D6%D8%B8%B4 本帖最后由 顽固不化 于 2009-7-28 21:24 编辑
$Fhd = FileOpen("gg.txt", 0)
Dim $line
$B = 1
While 1
$TxtLine = FileReadLine($Fhd, $B)
If @error Then ExitLoop
If $TxtLine="" Then ContinueLoop
$B = $B + 1
ReDim $line[$B]
$line[$B - 1] = $TxtLine
WEnd
FileClose($Fhd)
If $B=1 Then
MsgBox(16,"错误","原始TXT文件是空的!")
Exit
EndIf
$line=$B-1
Dim $newline
$newline = $line
$N = 2
$issam = False
For $o = 2 To $line
$word = StringSplit($line[$o], ",")
For $j = 1 To $n - 1
$temp = StringSplit($newline[$j], ",")
If $word = $temp Then
$newline[$j] = $line[$o]
$issam = True
ExitLoop
EndIf
Next
If $issam = False Then
$N = $N + 1
ReDim $newline[$N]
$newline[$N - 1] = $line[$o]
Else
$issam = False
EndIf
Next
$newline = $N - 1
$Fhd = FileOpen("newtxt.txt", 10)
For $i = 1 To $newline
FileWriteLine($Fhd, $newline[$i])
Next
FileClose($Fhd) 首先感谢顽固不化。我测试了,执行不成功,报错:If $word = $temp Then
If ^ ERROR 本帖最后由 顽固不化 于 2009-7-28 23:34 编辑
源TXT文件必须正规。因我没去做更多处理,比如存在有空格的空行,逗号不是英文的,每行不是4组的,每行的组不规范的...........
我是用这个TXT做测试的,生成文件名:newtxt.txt
本帖最后由 pusofalse 于 2009-7-29 02:36 编辑
#include <File.au3>
$sFile = "a.txt"
$sResultFile = "Result.txt"
$sResult = ""
For $i = _FileCountLines($sFile) to 1 Step -1
$sString = FileReadLine($sFile, $i)
$aString = StringSplit($sString, ",", 1)
If $aString < 2 or IsDeclared("_" & $aString) Then ContinueLoop
Assign("_" & $aString, 0)
$sResult = $sString & @CRLF & $sResult
Next
; Msgbox(0, "", $sResult)
FileWrite($sResultFile, $sResult)
ShellExecute($sResultFile)
本帖最后由 afan 于 2009-7-29 13:54 编辑
测试了下LS两位大侠的代码,结果都正确,只是5#的排序略有问题~ 6#的代码好精简,呵呵~ Re 7#:
看成数据是由", "(逗号+空格)分割的了,已经修改。 8# pusofalse
测试了,结果正确。 学习中~ 感谢pusofalse 大哥和顽固不化大哥。OK结案,小弟各奉上10块大洋 学习一下。。呵呵 学习了,谢谢分享~!~ pusofalse 大哥能告诉我你的原理吗?我看不大懂你的代码啊。但是你的效率的确很高! 没啥原理可说。只是从最后一行开始向前读取文本,每读取一行,先检查这行内容是否已经设为变量(IsDeclared),有的话说明它已经出现过,跳过。没有则设为变量(Assign),并把这行内容赋与变量$sResult,直到读取到第一行。最后$sResult的内容就是去除重复的内容。
去除重复是依靠代码If IsDeclared("_" & $aString) Then ContinueLoop和Assign("_" & $aString, 0)实现的。取最后一次更新的行是靠For $i = _FileCountLines($sFile) to 1 Step - 1(从后向前读取),实现的。结果之所以正确是因为$sResult = $sString & @CRLF & $sResult,而非$sResult &= $sString & @CRLF。此法虽然效率高,但如果有1万行互不相同的内容,那这段代码就要设置一万个不同的变量,代码所占用的内存就可想而知了。如果不想占用很多内存,可以用3#和7#的代码。肯定还有别的方法。 啊哈,了解了。感谢回复。pusofalse 大哥你之前研究的LocalSecurityAuthority.au3,我使用多次。真是好啊。AU3因你而精彩。感恩!
页:
[1]
2