[已解决]关于提取两个文本不同之处生成另一个文本的问题
本帖最后由 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=
_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
$a=_ArraySearch($file2,$file1[$i],1)
If $a=-1 And @error=6 Then
_ArrayAdd($chayi,$file1[$i])
$chayi =UBound($chayi)-1
EndIf
Next
For $i=1 To $file2
$a=_ArraySearch($file1,$file2[$i],1)
If $a=-1 And @error=6 Then
_ArrayAdd($chayi,$file2[$i])
$chayi =UBound($chayi)-1
EndIf
Next
If $chayi>0 Then
Return $chayi
EndIf
If $chayi=0 Then
Return ''
EndIf
EndIf
EndFunc
$w=_FileListCompare('A.txt','B.txt')
_ArrayDisplay($w) 呵呵!真没想到我这样的菜鸟也会被点名,惭愧啊!
真正的高手是Pusofalse版主和afan前辈,我只是个无名小辈而已! 呵呵,比我强的都是高手。 楼主这个问题昨晚我倒是做了些,分行比较倒是比较简单,如果要精确到每个字的比较 貌似容易出错,暂时没有好的思路。 我这里想到一个问题。 比如第一行一样。 而A文本的第二行跟B文本的第三行一样。。 这样只能算他不对吗。
呵呵 。 只是一点小心思 。不知道能不能实现 。
如果是A的第一行比较B的123456789,再A的第二行比较B的123456789.。我想这样会很浪费资源的吧。。 本帖最后由 waxy 于 2010-4-20 10:08 编辑
可以确定文件内容的行数是相同的且只有一行或且两行有某一个字符串不一样(不会出现5楼chenronting 兄弟说的那种情况)。把与原文件不一致那一行以及原文件(A.txt)所对应的那一行生成C.txt).如果A.txt与 B.txt两个文件的内容完全一致则程序不作任何输出自行结束。 回复 6# waxy
这种问题 调用BC解决最效率 RUNWAIT("CMD /C FC A.TXT B.TXT /B >C.TXT"
$str=fileread("c.txt")
if stringinstr($str,"关键字") then msgbox(4096,"找到","文件不一致") 本帖最后由 waxy 于 2010-4-20 10:47 编辑
回复 8# 3mile
呵呵,谢谢,这个方法跟我想的意思是完全一样;调用DOS命令用批处理是比较容易实现,哈哈我的目的不是来解决问题,现在是想学习用AU3。 本帖最后由 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 回复 10# afan
非感谢afan的指点!我自己再试一下看能不能实现查询C.txt的某个关键字,给个弹出窗口提示。 不用输出完了再查询吧,要弹出窗口提示信息直接在11行处写入提示信息,最后把18行改成Msgbox... 回复 10# afan
如果行数不一致,怎么去遍历比较呢? 回复afan
如果行数不一致,怎么去遍历比较呢?
tianya1631 发表于 2010-4-20 15:00 http://www.autoitx.com/images/common/back.gif
每读一行均对另一文本的全篇进行匹配 雷锋精神传天下!谢谢分享!
页:
[1]