wakillon

StringFinder v1.2.3

11 posts in this topic

#1 ·  Posted (edited)

I hate the Microsoft Windows search.

After trying the powerfull "Agent Ransack", i said to myself ; why not create a free alternative in AutoIt ?

201510141745381cpo1f.jpg

StringFinder replace my old TinyAu3FilesSearch utility and will be added to the next version of SciTE Hopper

Unlike to TinyAu3FileSearch, you can search strings in any "Text" files.

Source and compiled Version are available in the Download Section.

Enjoy !

 

Edited by wakillon
2 people like this

AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

Wow.. this is way cooler than the one I wrote, Bravo!!! :cheer:  Thanks for sharing!  My only constructive criticism would be the option to open the file in whatever editor you specify (or maybe the default mime type), other than that this thing is super awesome!!  Wait.. I see you have done this:

Local $iEncoding = FileGetEncoding($sSelectedFilesPath)
If $iEncoding > 512 Or $iEncoding = 16 Then
    ShellExecute('"' & $sSelectedFilesPath & '"')
Else
    If FileExists($sSciTEPath) Then
        Run($sSciTEPath & ' "' & $sSelectedFilesPath & '"')
    Else
        ShellExecute('"' & $sSelectedFilesPath & '"')
    EndIf
EndIf

Looks like you open it based on the file encoding, I prefer mime type so I replaced the above with this:

ShellExecute('"' & $sSelectedFilesPath & '"')

 

Here was my old grep function:

Func grepsearch($searchfold, $searchstr)
    If StringRight($searchfold, 1) <> "\" Then $searchfold = $searchfold & "\"
    Local $foldlist = _FileListToArrayRec($searchfold, "*", 2, 1)
    If UBound($foldlist) > 0 And GUICtrlRead($chkSubdirectories) = $GUI_CHECKED Then
        Local $filelist, $filecontents, $foundlist[9999999], $foundcnt = 0, $flo, $line, $z, $time
        For $i = 0 To $foldlist[0]
            If $i = 0 Then
                $filelist = _FileListToArray($searchfold, "*", 1)
                $foldlist[0] = "" ;so the next lines won't append the count to it.
            Else
                $filelist = _FileListToArray($searchfold & $foldlist[$i], "*", 1)
            EndIf
            If UBound($filelist) > 0 Then
                For $l = 1 To $filelist[0]
                    GUICtrlSetData($lblresults, $searchfold & $foldlist[$i] & $filelist[$l])
                    If FileGetSize($searchfold & $foldlist[$i] & $filelist[$l]) >= 100000000 Then
                        $flo = FileOpen($searchfold & $foldlist[$i] & $filelist[$l], 0)
                        $z = 0
                        While 1
                            $filecontents &= FileReadLine($flo)
                            If @error = -1 Then ExitLoop
                            If _MathCheckDiv($z, 3200000) Then
                                If StringInStr($filecontents, $searchstr, 1) Then
                                    ;found
                                    $foundlist[$foundcnt] = $searchfold & $foldlist[$i] & $filelist[$l]
                                    $foundcnt += 1
                                    ExitLoop
                                EndIf
                            Else
                                $line = ""
                            EndIf
                            $z += 1
                        WEnd
                        FileClose($flo)
                    Else
                        ;m('hit')
                        $filecontents = _FileRead($searchfold & $foldlist[$i] & $filelist[$l])
                        If StringInStr($filecontents, $searchstr, 1) Then
                            ;found
                            $foundlist[$foundcnt] = $searchfold & $foldlist[$i] & $filelist[$l]
                            $foundcnt += 1
                        EndIf
                    EndIf
                Next
            EndIf
        Next
    Else
        Local $filelist = _FileListToArray($searchfold, "*", 1), $filecontents, $foundcnt = 0, $foundlist[9999999]
        If UBound($filelist) > 0 Then
            For $l = 1 To $filelist[0]
                $filecontents = _FileRead($searchfold & $filelist[$l])
                If StringInStr($filecontents, $searchstr, 1) Then
                    ;found
                    $foundlist[$foundcnt] = $searchfold & $filelist[$l]
                    $foundcnt += 1
                EndIf
            Next
        EndIf
    EndIf
    ReDim $foundlist[$foundcnt]
    Return $foundlist
EndFunc   ;==>grepsearch

I never really did finish it, because I had a hard time parsing huge files and was trying to find the fastest way.... After testing yours, it skips the large files by default, which I haven't found a way to parse out a large file fast.  The only method I've seen on the forum is reading the files in chunks with either:  FileRead or _WinAPI_ReadFile.  But I do see that in your program you can specify the max file size, very nice!

Edited by TouchOdeath

Share this post


Link to post
Share on other sites

Glad you like it ;)

Thanks.

 


AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites

Excellent!
Suggestion: Add a field to exclude certain files from the search result (for example: " *old*.au3 "  to not list the backups).

Kind regards

M.C.

Share this post


Link to post
Share on other sites

Excellent!
Suggestion: Add a field to exclude certain files from the search result (for example: " *old*.au3 "  to not list the backups).

Kind regards

M.C.

You can add it manually in the "_FileExtCheck" function ;)

Thanks.


AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites

I expressed myself badly.

What I propose would not list files of name:

* old*.au3            (for example:   StringFinder_v1.2.3_old1.au3 in the "Backup" directory created by Scite.)

This feature cannot be added to the list contained in "_FileExtCheck".
I'm wrong?

Share this post


Link to post
Share on other sites

This represents how many files ? several dozen ? several hundred ?

It can also add the risk to exclude files who are not really "backup" files...

So, given the number of files read by second, i do not think it's really usefull.

 


AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites

Do not be disapointed !

Free to you to adapt it to your needs :)

Its just an example.


AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Share this post


Link to post
Share on other sites

Replacing this line:

If _ScriptIsAlreadyRunning() Then Exit MsgBox ( 262144+16, 'Exiting', $sSoftTitle & ' is Already Running !', 4 )

with this:

If _ScriptIsAlreadyRunning() Then Exit WinSetState("StringFinder v 1.2.3",'',@SW_SHOWNORMAL)

because having a message box telling you your stupid is annoying and a waste of time.

Share this post


Link to post
Share on other sites

Replacing this line:

If _ScriptIsAlreadyRunning() Then Exit MsgBox ( 262144+16, 'Exiting', $sSoftTitle & ' is Already Running !', 4 )

with this:

If _ScriptIsAlreadyRunning() Then Exit WinSetState("StringFinder v 1.2.3",'',@SW_SHOWNORMAL)

because having a message box telling you your stupid is annoying and a waste of time.

Thanks to share this profound reflection.;)

1 person likes this

AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

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

  • Similar Content

    • Innominate
      By Innominate
      How can I filter out everything in a string except for text between specific tags, specifically between <title>Message title</title> and <body id="msgFeedSummaryBody" selected="false">Summary text</body>
       
      I also want to extract the URL, which is given three times:
           1. Message-Id: <https://www.linktopage.htm@localhost.localdomain>
           2. Content-Base: https://linktopage.htm (no closing tag for this, just a line feed with the next one beginning with “Content-Type: “)
           3. <base href="https://www.linktopage.htm">
       
      Having extracted the Message title, Summary text, and URL, I want to save that in one of various text files, with a prompt for user input giving me a way (such as entering a letter, word, or clicking a radio button; the latter is preferable) to specify which file.
       
      Here is the code I have so far:
       
      #include <MsgBoxConstants.au3> Opt("WinTitleMatchMode", 2) ;1=start, 2=subStr, 3=exact, 4=advanced, -1 to -4=Nocase HotKeySet("^h", "_copy") While 1 Sleep(100) WEnd Func _copy() Send("^u") ; opens the message source of the news feed in my e-mail client (Thunderbird) showing all of the desired information Sleep(1000) Send("^a") ; select all of it Sleep(1000) Send("^c") ; copy it to clipboard EndFunc Now how can I filter the clipboard contents (as above), add to it (adding “-----------------------” as a separator, display it to the screen (for confirmation), and append it as plain text to one of several different files?
       
      Thank you!
    • vikashbitm2010
      By vikashbitm2010
      Hi all,
      I want to return string from autoit script to the python code.
      Autoit:
      Exit("22 FE 45") -> not working
      Exit(1) -> Working
      Exit(0) -> Working
      python:
      import os
      res=os.system(autoitmine.exe)
      print "res",res
      I got some hint of @ExitCode macro, but dont know how to use it to get the string in python variable 'res'.
      Please resolve this issue for me if anyone knows about this.
       
    • jjohn
      By jjohn
      Hi all,
      I have the following code, basically, it populates an array with unique characters found in a string, but it turns out only one character is in the array, i don't want to think it is due to a bug of autoit at this point, so i need your help on why, please
      Dim $sx[0] Dim $cn $ss = "Xx" ConsoleWrite(StringLeft($ss, 1) & " " & StringRight($ss, 1) & @CRLF) ConsoleWrite(StringLeft($ss, 1) = StringRight($ss, 1) & @CRLF) ;here show X <> x ConsoleWrite(@CRLF) ;the following is to populate array $sx with different unique characters in $ss For $b = 1 To StringLen($ss) $flg = 0 For $a = 0 To UBound($sx) - 1 ;if asc(StringMid($ss,$b,1)) = asc($sx[$a]) Then ;if this line is used instead of the next, everything is fine If StringMid($ss, $b, 1) = $sx[$a] Then If StringMid($ss, $b, 1) = "x" Then ConsoleWrite("<<->>" & StringMid($ss, $b, 1) & " " & $sx[$a] & @CRLF) $flg = 1 ExitLoop EndIf Next If $flg = 0 Then $cn = $cn + 1 ReDim $sx[$cn] $sx[$cn - 1] = StringMid($ss, $b, 1) EndIf Next ConsoleWrite(UBound($sx) & @CRLF);list the ubound of $sx ;list what is in array $sx For $a = 0 To UBound($sx) - 1 ConsoleWrite($sx[$a] & @CRLF) Next same code in a file is attached as uniqueChar2Array.au3
    • InunoTaishou
      By InunoTaishou
      I know on other languages when you try to use a string like this
      Global $sString = "Some String" If ($sString) Then ; ... EndIf The compiler will fail because string cannot be used in an expression where it needs a bool (something along those lines). But I see instances in other languages where using $sString in an expression will work and implicitly use the length of the string (or because there is some value in that variable).
      I'm wondering why AutoIt doesn't do the same. If the $sString is used like in my example (or some other expression where it wants a bool type) implicitly use the length of the string instead of the converting to 0?
    • FrancescoDiMuro
      By FrancescoDiMuro
      Good evening
      I was looking around the forum if I could find a function that allows to convert a string into a 2 dimensional array...
      The first column of the array is always the same, but the rows could change...
      I have a pattern like:

      Column A|Column B
      Static Text 1|Data 1
      Static Text 2|Data 2
      Static Text 3|Data 3
      Static Text 4|Data 4

      Where, Static Text (1...4) will be always the same, and I don't want to change them... But, Data 1...4 are dynamic fields... So, I could have the pattern above AND I coould have the pattern I'm going to show you right below

      Column A|Column B
      Static Text 1|Data 1
      Static Text 2|Data 2
      Static Text 3|Data 3
      Static Text 4|Data 4
      Static Text 1|Data 5
      Static Text 2|Data 6
      Static Text 3|Data 7
      Static Text 4|Data 8

      How can I do in this case?

      Thanks for everyone's help