找回密码
 加入
搜索
查看: 7129|回复: 16

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

[复制链接]
发表于 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......)与其它行的第二个值有重复,则删除该行。取最后一次更新的行。
向大大们请教,如何实现。不胜感激,奉献金币若干!
 楼主| 发表于 2009-7-28 18:38:25 | 显示全部楼层
1# qqgghh1

之前有搜索过,有关清除一个数组中的重复项,没有看懂,不知道能否解决我的问题。
http://www.autoitx.com/forum.php ... hlight=%D6%D8%B8%B4
发表于 2009-7-28 21:22:49 | 显示全部楼层
本帖最后由 顽固不化 于 2009-7-28 21:24 编辑
$Fhd = FileOpen("gg.txt", 0)
Dim $line[1]
$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[0]=$B-1
Dim $newline[2]
$newline[1] = $line[1]
$N = 2
$issam = False
For $o = 2 To $line[0]
        $word = StringSplit($line[$o], ",")
        For $j = 1 To $n - 1
                $temp = StringSplit($newline[$j], ",")
                If $word[2] = $temp[2] 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[0] = $N - 1
$Fhd = FileOpen("newtxt.txt", 10)
For $i = 1 To $newline[0]
        FileWriteLine($Fhd, $newline[$i])
Next
FileClose($Fhd)

评分

参与人数 1金钱 +10 收起 理由
qqgghh1 + 10

查看全部评分

 楼主| 发表于 2009-7-28 23:26:40 | 显示全部楼层
首先感谢顽固不化。我测试了,执行不成功,报错:If $word[2] = $temp[2] Then
If ^ ERROR
发表于 2009-7-28 23:32:45 | 显示全部楼层
本帖最后由 顽固不化 于 2009-7-28 23:34 编辑

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 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[0] < 2 or IsDeclared("_" & $aString[2]) Then ContinueLoop
        Assign("_" & $aString[2], 0)
        $sResult = $sString & @CRLF & $sResult
Next
; Msgbox(0, "", $sResult)
FileWrite($sResultFile, $sResult)
ShellExecute($sResultFile)

评分

参与人数 1金钱 +10 收起 理由
qqgghh1 + 10

查看全部评分

发表于 2009-7-29 01:38:47 | 显示全部楼层
本帖最后由 afan 于 2009-7-29 13:54 编辑

测试了下LS两位大侠的代码,结果都正确,只是5#的排序略有问题~ 6#的代码好精简,呵呵~
发表于 2009-7-29 02:33:47 | 显示全部楼层
Re 7#:
看成数据是由", "(逗号+空格)分割的了,已经修改。
发表于 2009-7-29 02:56:58 | 显示全部楼层
8# pusofalse


测试了,结果正确。 学习中~
 楼主| 发表于 2009-7-29 08:48:36 | 显示全部楼层
感谢pusofalse 大哥和顽固不化大哥。OK结案,小弟各奉上10块大洋
发表于 2009-7-29 10:58:51 | 显示全部楼层
学习一下。。呵呵
发表于 2009-7-29 13:26:43 | 显示全部楼层
学习了,谢谢分享~!~
 楼主| 发表于 2009-7-29 15:31:12 | 显示全部楼层
pusofalse 大哥能告诉我你的原理吗?我看不大懂你的代码啊。但是你的效率的确很高!
发表于 2009-7-29 18:34:57 | 显示全部楼层
没啥原理可说。只是从最后一行开始向前读取文本,每读取一行,先检查这行内容是否已经设为变量(IsDeclared),有的话说明它已经出现过,跳过。没有则设为变量(Assign),并把这行内容赋与变量$sResult,直到读取到第一行。最后$sResult的内容就是去除重复的内容。

去除重复是依靠代码If IsDeclared("_" & $aString[2]) Then ContinueLoop和Assign("_" & $aString[2], 0)实现的。取最后一次更新的行是靠For $i = _FileCountLines($sFile) to 1 Step - 1(从后向前读取),实现的。结果之所以正确是因为$sResult = $sString & @CRLF & $sResult,而非$sResult &= $sString & @CRLF。此法虽然效率高,但如果有1万行互不相同的内容,那这段代码就要设置一万个不同的变量,代码所占用的内存就可想而知了。如果不想占用很多内存,可以用3#和7#的代码。肯定还有别的方法。
 楼主| 发表于 2009-7-29 22:09:36 | 显示全部楼层
啊哈,了解了。感谢回复。pusofalse 大哥你之前研究的LocalSecurityAuthority.au3,我使用多次。真是好啊。AU3因你而精彩。感恩!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-16 21:36 , Processed in 0.089146 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表