dss Posted June 24, 2012 Posted June 24, 2012 (edited) I have very minimal knowledge of AutoIt. I come from basic/batch/vbscript/wisescript environment. I am learning AutoIt as I type this. I'm hoping someone can help me out / point me in the right direction. AutoIt has helped me in the past with many tasks. Again, I am a beginner here.I'm looking for a script that compares two text files (contains listing of files) and sorting out the differences. Once the differences have been sorted out, I want to delete the files that are "different."For example:[file1.txt content]c:dog.txtc:cat.txtc:mouse.txt[file2.txt content]c:dog.txtc:cat.txtc:mouse.txtc:bear.txtLogic:Difference = c:bear.txtDelete c:bear.txtAny help would be appreciated.-DS Edited June 24, 2012 by dss
Zedna Posted June 24, 2012 Posted June 24, 2012 Look at these functions in AutoIt's helpfile: FileRead() StringSplit() For/Next FileDelete() Resources UDF ResourcesEx UDF AutoIt Forum Search
Malkey Posted June 24, 2012 Posted June 24, 2012 The following results are from testing the below script:- Two 24KB text files with approx. 970 lines each, took 0.49 secs. Comparing a 24KB text file with approx. 1010 lines with a 30KB text file with approx. 1220 lines took 1.04 secs Comparing a 24KB text file with approx. 1010 lines with a 49KB text file with approx. 1940 lines took 3.37 secs Comparing two 49KB text files with approx. 1940 lines each, did not work correctly on my xp. "Comparing" meaning, creating an array containing lines that do not appear in both files. expandcollapse popup;#cs If FileExists("file1.txt") = 0 Then FileWrite("file1.txt", _ "c:\ dog.txt" & @CRLF & _ "c: \ cat.txt" & @CRLF & _ "c:\mouse.txt" & @CRLF & _ "c:\spider.txt") If FileExists("file2.txt") = 0 Then FileWrite("file2.txt", _ "c:\ pig.txt" & @CRLF & _ "c:\ dog.txt" & @CRLF & _ "c: \ cat.txt" & @CRLF & _ "c:\horse.txt" & @CRLF & @CRLF & _ "c:\mouse.txt" & @CRLF & _ "c:\bear.txt") ;#ce Local $begin = TimerInit() Local $aDeleteList = _FileDiffences("file1.txt", "file2.txt", 0) ; ConsoleWrite("Time taken: " & Round(TimerDiff($begin) / 1000, 4) & " secs" & @LF) ; If IsArray($aDeleteList) Then ConsoleWrite("Deleting Files:" & @LF) For $i = 0 To UBound($aDeleteList) - 1 ConsoleWrite($aDeleteList[$i] & @LF) If FileExists($aDeleteList[$i]) Then FileDelete($aDeleteList[$i]) Next EndIf FileDelete("file1.txt") FileDelete("file2.txt") ; Description: Compares two files by lines and returns the lines that do not exist in both files. ; Returns:- Array of the lines that do not exist in both files; or, ; Zero when both files are the same. Func _FileDiffences($file1, $file2, $iCaseSensitive = 0) Local $sCS = "" If ($iCaseSensitive = 0) Then $sCS = "(?i)" Local $sFile1Contents = StringRegExpReplace(FileRead($file1), "(\R+)", @CRLF) ; Remove blank lines Local $sFile2Contents = StringRegExpReplace(FileRead($file2), "(\R+)", @CRLF) ; Remove blank lines ;ConsoleWrite($sFile2Contents & @LF) If (($iCaseSensitive <> 0) And ($sFile1Contents = $sFile2Contents)) Or (($iCaseSensitive = 0) And ($sFile1Contents == $sFile2Contents)) Then Return 0 ; Create part of Reg Exp pattern Local $sFile1REs = "(?:" & StringRegExpReplace(StringRegExpReplace(StringStripWS($sFile1Contents, 2), '([\^\\\[\]\-\|\.\(\)\?\*\+\{\}\$''])', "\\$1"), "(\v+)", ")|(?:") & ")" Local $sFile2REs = "(?:" & StringRegExpReplace(StringRegExpReplace(StringStripWS($sFile2Contents, 2), '([\^\\\[\]\-\|\.\(\)\?\*\+\{\}\$''])', "\\$1"), "(\v+)", ")|(?:") & ")" ;ConsoleWrite($sFile1REs & @LF) ;ConsoleWrite($sFile2REs & @LF) Local $sNonMatchingLines = StringStripWS(StringRegExpReplace($sFile2Contents & @CRLF, $sCS & "((" & $sFile1REs & ")(?:\R+))", ""), 7) & @CRLF & _ StringRegExpReplace($sFile1Contents & @CRLF, $sCS & "((" & $sFile2REs & ")(?:\R+))", "") ;ConsoleWrite($sNonMatchingLines & @LF) Return StringRegExp($sNonMatchingLines, "([^\v]+)", 3) EndFunc ;==>_FileDiffences
AZJIO Posted June 25, 2012 Posted June 25, 2012 (edited) expandcollapse popup$Path_In1 = @ScriptDir & 'test_in1.txt' $Path_In2 = @ScriptDir & 'test_in2.txt' $Path_Out = @ScriptDir & 'test_Out.txt' $sText1 = FileRead($Path_In1) $sText2 = FileRead($Path_In2) $sText_Out = _Alike_Lines($sText1, $sText2) If @error Then MsgBox(0, 'Error', 'Error = ' & @error) Exit Else $hFile = FileOpen($Path_Out, 2) ; пишем в файл FileWrite($hFile, $sText_Out) FileClose($hFile) EndIf ; @error = 2 - Not found ; @error = 2 - Не найдено ; не учитывает регистр String = StRiNg = STRING ; not case sensitive, String = StRiNg = STRING Func _Alike_Lines($sText1, $sText2, $sep = @CRLF) Local $i, $k, $aText, $s, $Trg = 0, $LenSep If StringInStr($sText1 & $sText2, '[') And $sep <> '[' Then ; если сбойный символ есть до заменяем его For $i = 0 To 255 $s = Chr($i) If Not StringInStr($sText1 & $sText2, $s) Then If StringInStr($sep, $s) Then ContinueLoop $sText1 = StringReplace($sText1, '[', $s) $sText2 = StringReplace($sText2, '[', $s) $Trg = 1 ExitLoop EndIf Next If Not $Trg Then Return SetError(1, 0, '') EndIf $LenSep = StringLen($sep) $aText = StringSplit($sText1, $sep, 1) ; Создаём переменные первого файла For $i = 1 To $aText[0] Assign($aText[$i] & '/', -2, 1) Next Assign('/', 2, 1) $aText = StringSplit($sText2, $sep, 1) $k = 0 $sText1 = '' For $i = 1 To $aText[0] Assign($aText[$i] & '/', Eval($aText[$i] & '/') + 1, 1) ; создаём локальные переменные или увеличиваем значение для уже созданных If Eval($aText[$i] & '/') = -1 Then $sText1 &= $aText[$i] & $sep $k += 1 EndIf Next If $k = 0 Then Return SetError(2, 0, '') If $Trg Then $sText1 = StringReplace($sText1, $s, '[') Return StringTrimRight($sText1, $LenSep) EndFuncIf I did not understand, here's another optionexpandcollapse popup$Path_In1 = @ScriptDir & 'test_in1.txt' $Path_In2 = @ScriptDir & 'test_in2.txt' $Path_Out = @ScriptDir & 'test_Out.txt' $sText1 = FileRead($Path_In1) $sText2 = FileRead($Path_In2) $sText_Out = _Unique_Lines_Text2($sText1, $sText2) If @error Then MsgBox(0, 'Error', 'Error = ' & @error) Exit Else $hFile = FileOpen($Path_Out, 2) ; пишем в файл FileWrite($hFile, $sText_Out) FileClose($hFile) EndIf ; @error = 2 - Not found ; @error = 2 - Не найдено ; не учитывает регистр String = StRiNg = STRING ; not case sensitive, String = StRiNg = STRING Func _Unique_Lines_Text2($sText1, $sText2, $sep = @CRLF) Local $i, $k, $aText, $s, $Trg = 0, $LenSep If StringInStr($sText1 & $sText2, '[') And $sep <> '[' Then ; если сбойный символ есть до заменяем его For $i = 0 To 255 $s = Chr($i) If Not StringInStr($sText1 & $sText2, $s) Then If StringInStr($sep, $s) Then ContinueLoop $sText1 = StringReplace($sText1, '[', $s) $sText2 = StringReplace($sText2, '[', $s) $Trg = 1 ExitLoop EndIf Next If Not $Trg Then Return SetError(1, 0, '') EndIf $LenSep = StringLen($sep) $aText = StringSplit($sText1, $sep, 1) ; Создаём переменные первого файла For $i = 1 To $aText[0] Assign($aText[$i] & '/', 2, 1) Next Assign('/', 2, 1) $aText = StringSplit($sText2, $sep, 1) $k = 0 $sText1 = '' For $i = 1 To $aText[0] Assign($aText[$i] & '/', Eval($aText[$i] & '/')+1, 1) ; создаём локальные переменные или увеличиваем значение для уже созданных If Eval($aText[$i] & '/') = 1 Then $sText1 &= $aText[$i] & $sep $k += 1 EndIf Next If $k = 0 Then Return SetError(2, 0, '') If $Trg Then $sText1 = StringReplace($sText1, $s, '[') Return StringTrimRight($sText1, $LenSep) EndFunc Edited November 18, 2012 by AZJIO My other projects or all
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now