youtuber Posted April 5, 2020 Posted April 5, 2020 How can I find the different word in the txt file? Suppose you have the following words in the txt file. Dim $findUniqueDictionary[5] = ['autoit', 'autoit', 'script', 'script', 'forum'] Here the 'forum' word is different, I want to save it to test_OUT.txt but I want to do this with ObjCreate('Scripting.Dictionary') ! #include <file.au3> Dim $aRecords, $sOut Global $oDict = ObjCreate('Scripting.Dictionary') $oDict.CompareMode = 1 If Not _FileReadToArray("test.txt", $aRecords) Then MsgBox(4096, "Error", " Error reading file") Exit EndIf For $x = 1 To $aRecords[0] If Not $oDict.Exists($aRecords[$x]) Then $oDict.Add($aRecords[$x], 1) $sOut &= $aRecords[$x] & @CRLF EndIf Next FileWrite("test_OUT.txt", $sOut)
Malkey Posted April 5, 2020 Posted April 5, 2020 This appears to work. expandcollapse popup#include <file.au3> Local $findUniqueDictionary[5] = ['autoit', 'autoit', 'script', 'script', 'forum'] Local $sFileIn = "TestIn.txt", $sFileOut = "TestOut.txt" Local $aRecords, $sOut = "" If FileExists($sFileIn) Then FileDelete($sFileIn) _FileWriteFromArray($sFileIn, $findUniqueDictionary, Default, Default, @CRLF) ; https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/dictionary-object Local $oDict = ObjCreate('Scripting.Dictionary') $oDict.CompareMode = 1 ; 1 - Performs a textual comparison. If Not _FileReadToArray($sFileIn, $aRecords) Then MsgBox(4096, "Error", " Error reading file") Exit EndIf For $x = 1 To $aRecords[0] If $oDict.Exists($aRecords[$x]) Then $oDict.Item($aRecords[$x]) += 1 ; Increment record's item value. Else $oDict.Add($aRecords[$x], 1) ; Add new record EndIf Next ; $sOut only contains those records who's item is "1" only. Meaning the record in the file appears only once. For $x = 1 To $aRecords[0] If $oDict.item($aRecords[$x]) = 1 Then $sOut &= $aRecords[$x] & @CRLF Next If FileExists($sFileOut) Then FileDelete($sFileOut) FileWrite($sFileOut, $sOut) ShellExecute($sFileOut) Sleep(3000) ; Tidy files FileDelete($sFileIn) FileDelete($sFileOut) youtuber 1
mikell Posted April 5, 2020 Posted April 5, 2020 For the fun only #include <Array.au3> ;Global $aArray[10] = ["a","a","b","c","c","d","e","c","e"] Global $aArray[7] = ['script', 'autoit', 'autoit', 'script', 'script', 'forum', 'autoit'] _ArraySort($aArray) $r = StringReplace(StringRegExpReplace(_ArrayToString($aArray), '^\||(\w+)\|(?:\1\|*)+', ""), "|", @crlf) msgbox(0,"", $r) youtuber and iamtheky 2
youtuber Posted April 5, 2020 Author Posted April 5, 2020 (edited) @mikell StringRegExpReplace interesting ^\||(\w+)\|(?:\1\|*)+ https://prnt.sc/rtlybq @mikell How can I use this pattern for Notepad ++? _ArraySort _ArrayUnique no fast So I chose Scripting.Dictionary Edited April 5, 2020 by youtuber
mikell Posted April 6, 2020 Posted April 6, 2020 In the previous pattern the pipes are mentioned because they were included by _ArrayToString in a txt file there are newlines . So in Notepad++ do that : - first "Edit > line operations > sort descending" (important, the regex won't work if the lines are unsorted) - then use this pattern (\w+)\R(?:\1\R*)+ and "replace all" But of course SD is a much more handy way youtuber 1
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