qqgghh1 发表于 2009-7-28 18:35:32

记事本文件去除重复行问题

本帖最后由 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......)与其它行的第二个值有重复,则删除该行。取最后一次更新的行。
向大大们请教,如何实现。不胜感激,奉献金币若干!

qqgghh1 发表于 2009-7-28 18:38:25

1# qqgghh1

之前有搜索过,有关清除一个数组中的重复项,没有看懂,不知道能否解决我的问题。
http://www.autoitx.com/forum.php?mod=viewthread&tid=5591&highlight=%D6%D8%B8%B4

顽固不化 发表于 2009-7-28 21:22:49

本帖最后由 顽固不化 于 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)

qqgghh1 发表于 2009-7-28 23:26:40

首先感谢顽固不化。我测试了,执行不成功,报错:If $word = $temp Then
If ^ ERROR

顽固不化 发表于 2009-7-28 23:32:45

本帖最后由 顽固不化 于 2009-7-28 23:34 编辑

源TXT文件必须正规。因我没去做更多处理,比如存在有空格的空行,逗号不是英文的,每行不是4组的,每行的组不规范的...........

我是用这个TXT做测试的,生成文件名:newtxt.txt

pusofalse 发表于 2009-7-28 23:52:12

本帖最后由 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 01:38:47

本帖最后由 afan 于 2009-7-29 13:54 编辑

测试了下LS两位大侠的代码,结果都正确,只是5#的排序略有问题~ 6#的代码好精简,呵呵~

pusofalse 发表于 2009-7-29 02:33:47

Re 7#:
看成数据是由", "(逗号+空格)分割的了,已经修改。

afan 发表于 2009-7-29 02:56:58

8# pusofalse


测试了,结果正确。 学习中~

qqgghh1 发表于 2009-7-29 08:48:36

感谢pusofalse 大哥和顽固不化大哥。OK结案,小弟各奉上10块大洋

menfan1 发表于 2009-7-29 10:58:51

学习一下。。呵呵

superflq 发表于 2009-7-29 13:26:43

学习了,谢谢分享~!~

qqgghh1 发表于 2009-7-29 15:31:12

pusofalse 大哥能告诉我你的原理吗?我看不大懂你的代码啊。但是你的效率的确很高!

pusofalse 发表于 2009-7-29 18:34:57

没啥原理可说。只是从最后一行开始向前读取文本,每读取一行,先检查这行内容是否已经设为变量(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#的代码。肯定还有别的方法。

qqgghh1 发表于 2009-7-29 22:09:36

啊哈,了解了。感谢回复。pusofalse 大哥你之前研究的LocalSecurityAuthority.au3,我使用多次。真是好啊。AU3因你而精彩。感恩!
页: [1] 2
查看完整版本: 记事本文件去除重复行问题