找回密码
 加入
搜索
查看: 6238|回复: 14

[AU3基础] [已解决]关于提取两个文本不同之处生成另一个文本的问题

 火.. [复制链接]
发表于 2010-4-19 22:10:32 | 显示全部楼层 |阅读模式
本帖最后由 waxy 于 2010-4-27 21:18 编辑

最近一直在论坛上逛,看到很多关于文本文件内容处理及替换的贴子,AU3高手们(afan、pusofalse 、水木子等)给很多不错的代码或思路,
(说真的也从中学到了点皮毛,新手还有很多东西看不懂,别笑我,呵呵)。但一直没遇这样一种情况的------比如有两个文本文件(A.txt&B.txt)
需要对他们的内容进行比较,把两个文件内容的不相同的地方读取出来生产第三个文件(C.txt),然后再查找第三个文件(C.txt)内容,如果C.txt中
存在某一特定字符串,给个提示“比如XXX不一致)。求解,谢谢!
    再说明一下:可以确定文件内容的行数是相同的且只有一行或且两行有某一个字符串不一样(不会出现5楼chenronting 兄弟说的那种情况)。
把与原文件不一致那一行以及原文件(A.txt)所对应的那一行生成C.txt).如果A.txt与 B.txt两个文件的内容完全一致则程序不作任何输出自行结束。
假设A/B两个文本的内容如下:
A.txt  内容
张三:AABBCC
李四:CCBBAA

B.txt    内容
张三:AABBEE
李四:CCBBAA

那么C.txt输出的内容应该就是
张三:AABBCC
张三:AABBEE
论坛上有类似的代码(代码如下),但不能输出第三个文件,所以也办法通过查询C.txt文件内容,比如发现C.txt内容中有“张三”字符串(关键字),弹出窗口提示(比如“张三有误!”)
#include <array.au3>
#include <file.au3>
Func _FileListCompare($hSouce,$hTarget)
        Local $file1,$file2,$chayi[1]=[0]
        _FileReadToArray($hSouce,$file1)
                If @error Then 
                        Return ''
                        SetError (-1)
                EndIf
                
                _FileReadToArray($hTarget,$file2)
                        If @error Then 
                        Return ''
                        SetError (-2)
                        EndIf
                If IsArray($file1) And IsArray($file2) Then

                For $i=1 To $file1[0]
                        $a=_ArraySearch($file2,$file1[$i],1)
                        If $a=-1 And @error=6 Then
                                _ArrayAdd($chayi,$file1[$i])
                                $chayi[0] =UBound($chayi)-1
                        EndIf
                Next
                For $i=1 To $file2[0]
                        $a=_ArraySearch($file1,$file2[$i],1)
                        If $a=-1 And @error=6 Then
                                _ArrayAdd($chayi,$file2[$i])
                                $chayi[0] =UBound($chayi)-1
                        EndIf
                Next                
                
                
                
                
                If $chayi[0]>0 Then
                        Return $chayi
                EndIf

                If $chayi[0]=0 Then
                        Return ''
                EndIf
        EndIf

EndFunc

$w=_FileListCompare('A.txt','B.txt')
_ArrayDisplay($w)
发表于 2010-4-19 22:17:56 | 显示全部楼层
呵呵!真没想到我这样的菜鸟也会被点名,惭愧啊!
真正的高手是Pusofalse版主和afan前辈,我只是个无名小辈而已!
 楼主| 发表于 2010-4-20 08:50:52 | 显示全部楼层
呵呵,比我强的都是高手。
发表于 2010-4-20 09:05:54 | 显示全部楼层
楼主这个问题昨晚我倒是做了些,分行比较倒是比较简单,如果要精确到每个字的比较 貌似容易出错,暂时没有好的思路。
发表于 2010-4-20 09:32:35 | 显示全部楼层
我这里想到一个问题。 比如第一行一样。 而A文本的第二行跟B文本的第三行一样。。 这样只能算他不对吗。
呵呵 。 只是一点小心思 。不知道能不能实现 。
如果是A的第一行比较B的123456789,再A的第二行比较B的123456789.。我想这样会很浪费资源的吧。。
 楼主| 发表于 2010-4-20 09:55:30 | 显示全部楼层
本帖最后由 waxy 于 2010-4-20 10:08 编辑

可以确定文件内容的行数是相同的且只有一行或且两行有某一个字符串不一样(不会出现5楼chenronting 兄弟说的那种情况)。把与原文件不一致那一行以及原文件(A.txt)所对应的那一行生成C.txt).如果A.txt与 B.txt两个文件的内容完全一致则程序不作任何输出自行结束。
发表于 2010-4-20 10:10:20 | 显示全部楼层
回复 6# waxy


    这种问题 调用BC解决最效率
发表于 2010-4-20 10:19:40 | 显示全部楼层
RUNWAIT("CMD /C FC A.TXT B.TXT /B >C.TXT"
$str=fileread("c.txt")
if stringinstr($str,"关键字") then msgbox(4096,"找到","文件不一致")
 楼主| 发表于 2010-4-20 10:38:38 | 显示全部楼层
本帖最后由 waxy 于 2010-4-20 10:47 编辑

回复 8# 3mile
呵呵,谢谢,这个方法跟我想的意思是完全一样;调用DOS命令用批处理是比较容易实现,哈哈我的目的不是来解决问题,现在是想学习用AU3。
发表于 2010-4-20 14:02:56 | 显示全部楼层
本帖最后由 afan 于 2010-4-20 14:10 编辑

如果行数及位置一致那比较起来就很简单了
;
$ts = TimerInit()
$A = FileOpen('A.txt')
$B = FileOpen('B.txt')
$C = 'C.txt'
$out = ''
While 1
        $_A = FileReadLine($A)
        If @error = -1 Then ExitLoop
        $_B = FileReadLine($B)
        If @error = -1 Then ExitLoop
        If $_A <> $_B Then $out &= $_A & @CRLF & $_B & @CRLF
WEnd
FileClose($A)
FileClose($B)
If $out <> '' Then
        $out &= '耗时  ' & TimerDiff($ts) & '  毫秒 ' & @CRLF & @CRLF
        FileWrite($C, $out)
        ShellExecute($C)
EndIf
 楼主| 发表于 2010-4-20 14:22:02 | 显示全部楼层
回复 10# afan
非感谢afan的指点!我自己再试一下看能不能实现查询C.txt的某个关键字,给个弹出窗口提示。
发表于 2010-4-20 14:26:26 | 显示全部楼层
不用输出完了再查询吧,要弹出窗口提示信息直接在11行处写入提示信息,最后把18行改成Msgbox...
发表于 2010-4-20 15:00:24 | 显示全部楼层
回复 10# afan

如果行数不一致,怎么去遍历比较呢?
发表于 2010-4-20 15:34:06 | 显示全部楼层
回复  afan

如果行数不一致,怎么去遍历比较呢?
tianya1631 发表于 2010-4-20 15:00


每读一行均对另一文本的全篇进行匹配
发表于 2014-5-13 14:16:26 | 显示全部楼层
雷锋精神传天下!谢谢分享!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-6-1 12:03 , Processed in 0.085656 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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