Jump to content
david1337

First find text, Then do this

Recommended Posts

david1337

Hi guys

I have 3 txt files, and the script searches them, to find the txt file containing my username.
If found in one of the txt files, an msgbox will tell which txtfile my username was found in. Works fine.

;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
Global $Text[3] ;If changed, remember to change multiple places in the script.

$Text[0] = ("01_TextFile")
$Text[1] = ("02_TextFile")
$Text[2] = ("03_TextFile")

Global $DirforTxtFiles = "C:\Temp\"

$username = @UserName    ;pulls username that is logged in
;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/




; SCRIPT START

 For $i = 0 to 3 - 1

$TextFile = FileOpen($DirforTxtFiles & $Text[$i] & ".txt", 0)
$ReadText = FileRead($TextFile)
FileClose($TextFile)


If StringRegExp($ReadText, $username) Then


Call("MainScript")



EndIf


Next




Func MainScript()

MsgBox(0,"USER FOUND", "In following textfile: " & $Text[$i])

EndFunc

 

 

But now I want the script to do something else, if my username is NOT found in any of the txtfiles
The following example below here doesn't work, since the Else statement is placed inside the For loop, So it will run the Else statement, every time the StringRegExp doesn't find my username in a txtfile.

;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
Global $Text[3] ;If changed, remember to change multiple places in the script.

$Text[0] = ("01_TextFile")
$Text[1] = ("02_TextFile")
$Text[2] = ("03_TextFile")

Global $DirforTxtFiles = "C:\Temp\"

$username = @UserName    ;pulls username that is logged in
;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/




; SCRIPT START

 For $i = 0 to 3 - 1

$TextFile = FileOpen($DirforTxtFiles & $Text[$i] & ".txt", 0)
$ReadText = FileRead($TextFile)
FileClose($TextFile)


If StringRegExp($ReadText, $username) Then


Call("MainScript")


Else
Call("NotInTextFile")


EndIf


Next






Func MainScript()

MsgBox(0,"USER FOUND", "In following textfile: " & $Text[$i])

EndFunc





;\/___________________________________________________________________________\/
Func NotInTextFile()

MsgBox(0,"", "USER NOT IN ANY TEXTFILE")

EndFunc

 

What it SHOULD do, is search the txtfiles for my username, and then when all the searching is done, it should react based on the search result.

The answer might be quite obvious, but I'm stuck at this point.

 

Any ideas would be much appreciated :)

Edited by david1337

Share this post


Link to post
Share on other sites
water

I would try something like this:

;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
Global $aText[] = ["01_TextFile", "02_TextFile", "03_TextFile"]
Global $sDirforTxtFiles = "C:\Temp\"
$sUsername = @UserName ; Pulls username that is logged in
;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

; SCRIPT START
For $i = 0 To UBound($aText) - 1
    $hTextFile = FileOpen($sDirforTxtFiles & $aText[$i] & ".txt", 0)
    $sReadText = FileRead($hTextFile)
    FileClose($hTextFile)
    If StringRegExp($sReadText, $sUsername) Then
        MainScript()
    Else
        NotInTextFile()
    EndIf
Next

Func MainScript()
EndFunc   ;==>MainScript

Func NotInTextFile()
EndFunc   ;==>NotInTextFile

 


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2018-06-01 - Version 1.4.9.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-01-27 - Version 1.3.3.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites
david1337

Hi water

Thanks for your time!
I'm afraid that your example gives the same result.
Say my username is found in 03_Textfile.txt, the 2 first searches gives me the Else function, and then the if function
So in your example I get the MsgBox(0,"", "USER NOT IN ANY TEXTFILE") 2 times before the MsgBox(0,"USER FOUND"...

;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
Global $aText[] = ["01_TextFile", "02_TextFile", "03_TextFile"]
Global $sDirforTxtFiles = "C:\Temp\"
$sUsername = @UserName ; Pulls username that is logged in
;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

; SCRIPT START
For $i = 0 To UBound($aText) - 1
    $hTextFile = FileOpen($sDirforTxtFiles & $aText[$i] & ".txt", 0)
    $sReadText = FileRead($hTextFile)
    FileClose($hTextFile)
    If StringRegExp($sReadText, $sUsername) Then
        MainScript()
    Else
        NotInTextFile()
    EndIf
Next

Func MainScript()
   MsgBox(0,"USER FOUND", "In following textfile: " & $aText[$i])
EndFunc   ;==>MainScript

Func NotInTextFile()
   MsgBox(0,"", "USER NOT IN ANY TEXTFILE")
EndFunc   ;==>NotInTextFile

 

Edited by david1337

Share this post


Link to post
Share on other sites
water

Then I would set a flag and call the Not-Found-Function after all files have been checked:

;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
Global $aText[] = ["01_TextFile", "02_TextFile", "03_TextFile"]
Global $sDirforTxtFiles = "C:\Temp\"
Global $bFound = False
$sUsername = @UserName ; Pulls username that is logged in
;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

; SCRIPT START
For $i = 0 To UBound($aText) - 1
    $hTextFile = FileOpen($sDirforTxtFiles & $aText[$i] & ".txt", 0)
    $sReadText = FileRead($hTextFile)
    FileClose($hTextFile)
    If StringRegExp($sReadText, $sUsername) Then
        $bFound = True
        MainScript()
    EndIf
Next
If $bFound = False Then NotInTextFile()

Func MainScript()
    MsgBox(0, "USER FOUND", "In following textfile: " & $aText[$i])
EndFunc   ;==>MainScript

Func NotInTextFile()
    MsgBox(0, "", "USER NOT IN ANY TEXTFILE")
EndFunc   ;==>NotInTextFile

 

  • Like 1

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2018-06-01 - Version 1.4.9.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-01-27 - Version 1.3.3.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites
water

Another question: If the script finds the username in more than one file do you want to get the MsgBox multiple times?


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2018-06-01 - Version 1.4.9.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-01-27 - Version 1.3.3.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites
david1337

Exactly what I was searching for. The flag did the trick.
Thanks water!

Share this post


Link to post
Share on other sites
david1337

Another question: If the script finds the username in more than one file do you want to get the MsgBox multiple times?

Actually if that is the case, I should still get the MsgBox multiple times yes, but after that it should call a new function ONCE, based on how many times my username is found.
So the script itself must be aware that my username has been found more than once, and react from it. Is that possible also with flags?

Thanks! :)

;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
Global $aText[] = ["01_TextFile", "02_TextFile", "03_TextFile"]
Global $sDirforTxtFiles = "C:\Temp\"
Global $bFound = False
$sUsername = @UserName ; Pulls username that is logged in
;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

; SCRIPT START
For $i = 0 To UBound($aText) - 1
    $hTextFile = FileOpen($sDirforTxtFiles & $aText[$i] & ".txt", 0)
    $sReadText = FileRead($hTextFile)
    FileClose($hTextFile)
    If StringRegExp($sReadText, $sUsername) Then
        $bFound = True
        MainScript()
    EndIf
Next
If $bFound = False Then NotInTextFile()

Func MainScript()
    MsgBox(0, "USER FOUND", "In following textfile: " & $aText[$i])
    ;If username only found once, do THIS <----------------------------------------------------
    ;If username found more than once, do THAT <-----------------------------------------------
EndFunc   ;==>MainScript

Func NotInTextFile()
    MsgBox(0, "", "USER NOT IN ANY TEXTFILE")
EndFunc   ;==>NotInTextFile

 

Edited by david1337

Share this post


Link to post
Share on other sites
water

In this case you need a counter:

;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
Global $aText[] = ["01_TextFile", "02_TextFile", "03_TextFile"]
Global $sDirforTxtFiles = "C:\Temp\"
Global $iFound = 0
$sUsername = @UserName ; Pulls username that is logged in
;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

; SCRIPT START
For $i = 0 To UBound($aText) - 1
    $hTextFile = FileOpen($sDirforTxtFiles & $aText[$i] & ".txt", 0)
    $sReadText = FileRead($hTextFile)
    FileClose($hTextFile)
    If StringRegExp($sReadText, $sUsername) Then
        $iFound = $iFound + 1
        MainScript()
    EndIf
Next
If $iFound = 0 Then NotInTextFile()
If $iFound > 1 Then FoundMultipleTimes()

Func MainScript()
    MsgBox(0, "USER FOUND", "In following textfile: " & $aText[$i])
EndFunc   ;==>MainScript

Func NotInTextFile()
    MsgBox(0, "", "USER NOT IN ANY TEXTFILE")
EndFunc   ;==>NotInTextFile

Func FoundMultipleTimes()
    MsgBox(0, "", "USER FOUND MULTIPLE TIMES")
EndFunc   ;==>FoundMultipleTimes

 

  • Like 1

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2018-06-01 - Version 1.4.9.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-01-27 - Version 1.3.3.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites
david1337

Of course! So $iFound = $iFound + 1 adds 1 to the counter every time there is a match, and If $iFound > 1 Then FoundMultipleTimes() determines if that counter is larger than 1, then we have multiple hits.

So logical, so nice :)

water you're the best, thanks!

Edited by david1337

Share this post


Link to post
Share on other sites
water

Another enhancement could be to do the processing in two steps.

  1. Determine how many files contain the username
  2. Process the files depending on how many files have been found.
    2.1 No files
    2.2. One file
    2.3 Multiple files

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2018-06-01 - Version 1.4.9.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-01-27 - Version 1.3.3.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites
david1337

Yeah you are correct. In the actual setup where there is up to 20 txt files, the current looping process is a bit heavy and clumsy :/

Share this post


Link to post
Share on other sites
water

I suggest something like this:

;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
Global $aText[] = ["01_TextFile", "02_TextFile", "03_TextFile"]
Global $aFound[UBound($aText)] ; Table with a flag (True) for each found file
Global $iFound = 0 ; Counter for found files
Global $sDirforTxtFiles = "C:\Temp\"
$sUsername = @UserName ; Pulls username that is logged in
;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

; SCRIPT START
For $i = 0 To UBound($aText) - 1
    $hTextFile = FileOpen($sDirforTxtFiles & $aText[$i] & ".txt", 0)
    $sReadText = FileRead($hTextFile)
    FileClose($hTextFile)
    If StringRegExp($sReadText, $sUsername) Then
        $iFound = $iFound + 1 ; Update counter
        $aFound[$i] = True ; Set found flag for this file
    EndIf
Next
If $iFound = 0 Then FoundNone() ; No file found
If $iFound = 1 Then FoundOne()  ; One file found  
If $iFound > 1 Then FoundMany() ; More than one file foun

Func FoundNone()
    MsgBox(0, "", "USER NOT IN ANY TEXTFILE")
EndFunc   ;==>FoundNone

Func FoundOne()
    MsgBox(0, "USER FOUND", "In following textfile: " & $aText[$i])
EndFunc   ;==>FoundOne

Func FoundMany()
    Local $sFoundFiles
    For $i = 1 To UBound($aFound) - 1
        If $aFound[$i] = True Then $sFoundFiles = $sFoundFiles & $aText[$i] & @CRLF
    Next
    MsgBox(0, "", "USER FOUND IN " & $iFound & " FILES:" & @CRLF & @CRLF & $sFoundFiles)
EndFunc   ;==>FoundMany

 

Edited by water
  • Like 1

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2018-06-01 - Version 1.4.9.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-01-27 - Version 1.3.3.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites
david1337

Hi water

I just rewrote the entire script based on your example above. It's a lot more complicated in the actual script, but finally got it working.. phew!

Once again, thanks for all your guidance!

David

Edited by david1337

Share this post


Link to post
Share on other sites
water

Glad to be of service :)


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2018-06-01 - Version 1.4.9.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (2018-01-27 - Version 1.3.3.1) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

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

    • rm4453
      By rm4453
      Hello,
       
      I am currently writing a program that parses a massive table from a website, and need a way to add a progress bar while parsing.
      I am currently using the function _IETableWriteToArray($oObj, True) to parse the array. I need the progress bar to update as the table is parsed, not just at the end of the parsing.
      Any help at all would be very much appreciated!
       
      *EDIT --> The array I am left with after parsing is $array[0-50000][16]
    • TrashBoat
      By TrashBoat
      So Im trying to make a simple 2d game and make some sort of collision detection so why not to make a 2 dimensional array but i have no clue how  to write it in multiple lines
      Global $map[5,5] = [0,0,0,0,0 _ [0,0,0,0,0 _ [0,0,0,0,0 _ [0,0,0,0,0 _ [0,0,0,0,0] something like this but it doesn't work
    • Zein
      By Zein
      #include "..\Include\Array.au3" #include "..\Include\File.au3" #include "..\Include\AutoItConstants.au3" Local $aRetArray Local $sFilePath = "n.csv" _FileReadToArray($sFilePath, $aRetArray, ",") ; _FileReadToArray($sFilePath, $aRetArray, $FRTA_COUNT, ",") _ArrayDisplay($aRetArray, "Original", Default, 8) The above code shows two versions of _FileReadToArray and both don't work as expected.
      The first one doesn't use the comma as a delimiter. (so I get a single column array)  I tried adding "Default" between $aRetArray and "," then it told me it had an incorrect number of parameters. 

      I looked again at the documentation:
       
      #include <File.au3> _FileReadToArray ( $sFilePath, ByRef $vReturn [, $iFlags = $FRTA_COUNT [, $sDelimiter = ""]] )
      And I with or without the flags params I should be getting a 2D array due to my file being a csv. 
      I then tried a regular flag, $FRTA_COUNT, and it tells me that I'm using a variable $FRTA_COUNT while it's not declared. Tried putting in 1 instead and it told me again, incorrect number of params. 

       
    • ternal
      By ternal
      Hi,
      Recently I have had the need to do a sort and then do a second sort while the item of the first sort stays the same ( double sorting , first on column x then while column x is the same sort column y).
      I did not put much efffort into error checking but so far I did not need it.
      For my applications so far it works perfectly however if someone is willing I want to test this extensivly.
      If anyone has big lists of random stuff to sort could you try this out please?
      #include <Array.au3> ; #FUNCTION# ==================================================================================================================== ; Name ..........: _ArraySort_Double ; Description ...: ; Syntax ........: _ArraySort_Double (Byref $array[, $first_index = Default[, $second_index = Default[, $ascending = Default]]]) ; Parameters ....: $array - 2d array to sort. ; $first_index - [optional] first column to sort. Default is 0. ; $second_index - [optional] second column to sort. Default is 1. ; $ascending - [optional] ascending/descending. Default is 1. ; Return values .: 1 if no errors occured , -1 if errors occured ; Author ........: Ternal ; Remarks .......: Needs excessive testing. ; Related .......: _arraysort() ; =============================================================================================================================== Func _ArraySort_Double (byref $array, $first_index = Default, $second_index = Default, $ascending = Default) Local $temp_value Local $counter = 1 If UBound($array, $UBOUND_DIMENSIONS) <> 2 Then MsgBox(0, "error", "error") return -1 EndIf If $first_index = Default Then $first_index = 0 If $second_index = Default Then $second_index = 1 If $ascending = Default Then $ascending = 1 _ArraySort($array, $ascending, 0, 0, $first_index); you can alter settings of primary sort here If @error Then MsgBox(0, "error", @error) return -1 EndIf $temp_value = $array[0][$first_index] For $x = 1 to UBound($array, 1) - 1 If Mod( $x, 10000) = 0 Then ConsoleWrite("at " & $x & " of a total : " & UBound($array, 1) & @CRLF) If $array[$x][$first_index] = $temp_value Then $counter+= 1 If $x = UBound($array, 1) - 1 Then; do last line here(if last line is not a new item) _ArraySort($array, $ascending, $x - $counter, $x, $second_index);you can alter settings of secondary sort here(don't forget to place line 34 the exact same) If @error Then MsgBox(0, "error", @error) return -1 EndIf EndIf Else If $counter > 0 Then ;at least 2 of the same _ArraySort($array, $ascending, $x - $counter, $x - 1, $second_index);you can alter settings of secondary sort here(don't forget to place line 29 the exact same) If @error Then MsgBox(0, "error", @error) return -1 EndIf $counter = 1 EndIf EndIf $temp_value = $array[$x][$first_index] Next Return 1 EndFunc Kind regards, Ternal
    • TrashBoat
      By TrashBoat
      So I've made this script that detects how long i have held down my left mouse button for and stores the information in an array and then sorts its using _ArraySort but the output is half sorted half broken.
      Here's my script:
      HotKeySet("{F1}","_exit") #include <Misc.au3> #include <Timers.au3> #include <Array.au3> Local $dll = DllOpen("user32.dll") $on = False Global $array[0] While(1) If _IsPressed(01,$dll) Then $timer = _Timer_Init() While _IsPressed(01,$dll) Sleep(1) WEnd $time = _Timer_Diff($timer) _ArrayAdd($array,"Time: " & Floor($time) & " ms") ;~ ConsoleWrite("Time: " & Floor($time) & " ms" & @CRLF) EndIf Sleep(50) WEnd Func _exit() _ArraySort($array) _ArrayDisplay($array) Exit EndFunc And the output:

      See how its not sorted?  What is the problem here?
×