Jump to content
Sign in to follow this  
dss

AutoIt masters - need assistance comparing and deleting

Recommended Posts

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.txt

c:cat.txt

c:mouse.txt

[file2.txt content]

c:dog.txt

c:cat.txt

c:mouse.txt

c:bear.txt

Logic:

Difference = c:bear.txt

Delete c:bear.txt

Any help would be appreciated.

-DS

Edited by dss

Share this post


Link to post
Share on other sites

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.

;#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

Share this post


Link to post
Share on other sites

$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)
EndFunc

If I did not understand, here's another option

$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 by AZJIO

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By nacerbaaziz
      hello evrybody
      here is an example about how to split your texts using a delimiter with the ability to select how much of delimiters shows in each colum  with $i_number
      e.g
      you have a long text and you want to split it in an array
      that evry colum have a number (n) of lines
      i made a function that do that for you
      just call it with a three params
      $s_text
      your text
      $i_number
      the number that you want to put in each col
      $s_siparator
      the siparator
      default is "|"
      here is the function with example
      i hope that it will be useful for you
       
      ****
       
      #include <Array.au3> $s_txt = "some text1some text2|some text3|some text4|some text5|some text6" $array = splitText($s_txt, 2) _ArrayDisplay($array) Func splitText($s_text, $i_number, $s_siparator = "|") Local $a_TXT = StringSplit($s_text, $s_siparator) Local $a_Return[$a_TXT[0] + 1] If ($a_TXT[0] <= $i_number) Or ($i_number <= 0) Then ReDim $a_Return[2] $a_Return[0] = 1 $a_Return[1] = $s_text Return $a_Return EndIf Local $i_Processed = 1, $i_arrayProcessed = 1 Do For $i = $i_Processed To ($i_Processed + $i_number) - 1 If ($a_TXT[0] < $i) Then ExitLoop If Not ($a_Return[$i_arrayProcessed]) Then $a_Return[$i_arrayProcessed] = $a_TXT[$i] Else $a_Return[$i_arrayProcessed] &= $s_siparator & $a_TXT[$i] EndIf $i_Processed += 1 Next $i_arrayProcessed += 1 Until ($a_TXT[0] < $i_Processed) ReDim $a_Return[$i_arrayProcessed] $a_Return[0] = $i_arrayProcessed - 1 Return $a_Return EndFunc ;==>splitText
      accept my greetings
      thanks to
      @Dan_555
      for his notes
       
    • By nacerbaaziz
      goodmorning autoit team
      today am comming with some winhttp problems, i hope that you can help me to solve them.
      the first problem
      is when opening a request
      my forums api allow me to delete any post using the api key
      all functions work, i mean post / get
      but when i tried to use the delete verb it's gave me an html 404 error
      here is what am tried
      #include "WinHttp.au3" ; Open needed handles Global $hOpen = _WinHttpOpen() Global $hConnect = _WinHttpConnect($hOpen, "xxxxxxxx.com") ; Specify the reguest: Global $hRequest = _WinHttpOpenRequest($hConnect, "Delete", "/vb/Api/posts/10447/?hard_delete=true", default, default) _WinHttpAddRequestHeaders($hRequest, "XF-Api-Key:xxxxx") _WinHttpAddRequestHeaders($hRequest, "XF-Api-User:xxxxx") ; Send request _WinHttpSendRequest($hRequest) ; Wait for the response _WinHttpReceiveResponse($hRequest) Global $sHeader = 0, $sReturned = 0 ; If there is data available... If _WinHttpQueryDataAvailable($hRequest) Then $sHeader = _WinHttpQueryHeaders($hRequest, $WINHTTP_QUERY_CONTENT_DISPOSITION) ;Or maybe: ; $sHeader = _WinHttpQueryHeaders($hRequest, BitOR($WINHTTP_QUERY_RAW_HEADERS_CRLF, $WINHTTP_QUERY_CUSTOM), "Content-Disposition") Do $sReturned &= _WinHttpReadData($hRequest) Until @error msgBox(64, "", $sReturned) endIf ; Close handles _WinHttpCloseHandle($hRequest) _WinHttpCloseHandle($hConnect) _WinHttpCloseHandle($hOpen)  
      and here is the error message
      <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>403 Forbidden</title> </head><body> <h1>Forbidden</h1> <p>You don't have permission to access /vb/Api/posts/10447/ on this server.<br /> </p> </body></html>  
      i hope you can help me 
      thanks in advance
    • By nacerbaaziz
      hello autoit team
      please i've a question for you.
      am creating a audio player
      and in this audio player i want to show the current trac info
      such as the total time and the position ... etc
      i know i can show it as label
      but the screen reader for the blind read the text every change
      because it have a screen scan
      what i want is to show this informations but such image or icon
      i mean i need to create
      GUICtrlCreatepic or GUICtrlCreateicon ....
      or some thing as that
      and show this informations as image on it
      i think that i can do that with the 
      _GDIPlus functions
      but i couldn't find the currect way to do it
      i tried the _GDIPlus_GraphicsDrawString
      but i couldn't know how it work
      what i need is a small example that create a GUI
      and add a multy line text to it as graphic or image.
      so i need a simple way because it will changed every sec
      i hope any one can help me to do that
      global $GUI = GUICreate("text", 400, 400) global $label = GUICtrlCreateLabel(GetText(), 10, 10, 380, 380) GUISetState() do sleep(100) until GUIGetMSG() = -3 exit func GetText() return StringFormat("file name is test.mp3 \r\n total time is 00:30:00 \r\n position is 00:05:50") endFunc  
    • By nacerbaaziz
      hello autoit group
      please i've a question
      i had make a function that put some thing into the clipBoard and paste it
      using the send function
      e.g
      ClipPut("hello")
      send("^v")
       
      when the keyboard is english all things work fine
      but when the keyboard is arabic the send command write the ltr v insted of the text in clipboard
      i was tryed to use
      send("{ctrldown}v{ctrlUp}")
      but the same
      please can any one help me
       
    • By Kiko745
      Hello!
      I am new to autoit so please if someone could help me. I am trying to combine multiple .txt files but I can't get it right. In every file are the exact amout of lines ( for example here are 2 ) ,            I don't want to make it for just 2 lines for each txt files but for all the lines the txt files contains. The thing I want to do is :
      Text File 1
      Hello my name
      I am a big
      ...
      Text File 2
      is Fred,
      Potato head for
      ...
      Text File 3
      and I like to eat pizza.
      Not getting this right.
      ...
      ------------------- Combine them all into one txt file like here ------------------------------
      Final Text file
      Hello my name is Fred, and I like to eat pizza.
      I am a big Potato head for Not getting this right.
      ...
       
      Thanks for any advice!
      P.S. Sorry for my English, not my first language.
       
×
×
  • Create New...