Storm Posted July 16, 2012 Posted July 16, 2012 Hi, I tried to search for this, but while I did get a lot of results, nothing with what I wanted. I need a script that searches a text file line by line backwords. Basically I need to be able to find the first line from bottom that starts with "Jump". Once I have that line identified, I just want to copy it to the clipboard. The stupid thing is, I made a script a few years ago that did that. But then I lost it and now I cant remember what commands I used. I dont use Autoit very often and at best I can just read the help file and try to make basic scripts using that. But in this case, I just cant find what I need. Hopefully someone here can help.
iamtheky Posted July 16, 2012 Posted July 16, 2012 (edited) I'd go with Fileread _stringreverse stringregexp for the entire line containing "pmuj" *_stringreverse clipput *edit - you'd need to reverse back i suppose Edited July 16, 2012 by boththose ,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-. |(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/ (_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_) | | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) ( | | | | |)| | \ / | | | | | |)| | `--. | |) \ | | `-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_| '-' '-' (__) (__) (_) (__)
Storm Posted July 16, 2012 Author Posted July 16, 2012 (edited) I just remmebered the command I used. This is what I tried. #include <File.au3> $CountLines = _FileCountLines("1.txt") $file = FileOpen("1.txt", 0) While 1 $line = FileReadLine ( "1.txt" , $CountLines) If NOT StringInStr ($line, "Jump to " , 1, 1, 1, 8) = 0 Then ExitLoop $CountLines = $CountLines -1 Wend Clipput ($line) Exit Seems to work fine with a test sample. Lets hope it works as good where its meant to. Thanks anyway boththose. Appriciate the help. Edited July 16, 2012 by Storm
iamtheky Posted July 16, 2012 Posted July 16, 2012 ahh you just wanted the line number. I believe the help file would recommend using the handle rather than the file name in your filereadline. ,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-. |(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/ (_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_) | | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) ( | | | | |)| | \ / | | | | | |)| | `--. | |) \ | | `-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_| '-' '-' (__) (__) (_) (__)
Storm Posted July 16, 2012 Author Posted July 16, 2012 (edited) That script actually gives me the full line. Not just the number. Now I have added other stuff to it so its all finished. The only thing Im stuck on is how to use a hotkey that functions as a normal. Like if I want to set Alt+0 as the hotkey, when pressed, I want Alt+0 to go as normal and do what it would usually do as well as activating the hotkey in the script. Currently it just seems to block the use of ALt+0 and just activates the hotkey. Edited July 16, 2012 by Storm
iamtheky Posted July 17, 2012 Posted July 17, 2012 yup seems fine, dont know why my paste resulted in a 1 the previous run. ,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-. |(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/ (_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_) | | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) ( | | | | |)| | \ / | | | | | |)| | `--. | |) \ | | `-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_| '-' '-' (__) (__) (_) (__)
pieeater Posted July 17, 2012 Posted July 17, 2012 it isn't the best solution but using _IsPressed() is close to what you want. there are 2 problems though: 1. you have to loop it as an if statement. you cant execute it from anywhere like you can with HotKeySet() 2. it will execute multiple times if the button is held unless you have a Sleep(), which could effect usability. heres an example: #include <Misc.au3> Local $hDLL = DllOpen("user32.dll") $ctr = 0 While $ctr <> 50 If _IsPressed(12, $hDLL) Then If _IsPressed(30, $hDLL) Or _IsPressed(60, $hDLL) Then ;two here so it can be the num pad 0 or the other 0 _insertFunctionHere() Sleep(100) EndIf EndIf WEnd Func _insertFunctionHere() Send('1') $ctr += 1 EndFunc when i ran it and held down Alt+0 i got this output: 110110111001111010101101100110110101011110100110110101101101011101110011010 so it calls the function and still registers the keys. [spoiler]My UDFs: Login UDF[/spoiler]
Storm Posted July 17, 2012 Author Posted July 17, 2012 _IsPressed only works if the user is actually holding the key down, right? In my case it will just be a normal press. Also, since the script will end up checking for the press every 100 or so miliseconds, will that slow down windows? The people who will be using this will most likely be on laptops or netbooks. Is it safe ot use or can it cause system sluggishness by taking up resources? Right now Im getting around it by disabling the hotkey, then running Alt+0, then setting the hotkey to Alt+0 again. And the rest of the script follows after that. It seems to work fine, but 1 out of 5 times it doesent do a thing, so I have to press it again. Still, I will give it a try with this method and see which one feels better to use. Its just strange that Autohotkey has an option for this but Autoit doesent.
AZJIO Posted July 17, 2012 Posted July 17, 2012 $sText = '45243 ' & @CRLF & _ '45ygf5' & @CRLF & _ 'Jump' & @CRLF & _ 'sdfsd' & @CRLF & _ 'Jump' & @CRLF & _ '4356' $n = StringInStr($sText, @CRLF & 'Jump', 0, -1) MsgBox(0, '', UBound(StringRegExp(StringLeft($sText, $n), '(rn|r|n)', 3))+1) My other projects or all
pieeater Posted July 17, 2012 Posted July 17, 2012 _IsPressed() will return true if the key is pressed, held, etc. and since it's only checking every 100 milliseconds or so it wont slow down windows at all. i usually put the sleep at 10 which is more than enough time, but here i didn't want the function called too many times. [spoiler]My UDFs: Login UDF[/spoiler]
Moderators Melba23 Posted July 17, 2012 Moderators Posted July 17, 2012 Storm,Using FileReadLine as you have in post #3 above is an appalling coding technique. Each time you call that function with a line number you force the script to read right through the file each time until that line number - imagine if you have several thousand lines to read each time! The best way to do it is to use _FileReadToArray and then search the array in memory. Here are some representative timings from my tests on a 2000 line file where I was searching for text in the first line: FileReadLine: 4292.44422126276 FileReadToArray: 17.6231895394526Quite a difference - I hope you agree! M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
Storm Posted July 20, 2012 Author Posted July 20, 2012 Yea, you are right. Though I might leave it like as it is simply because this file is actually part of the game log. It gets trimmed every time it goes over 100 lines. And 95% of the times, the line it is looking for is one of the bottom 5. Still thanks for the heads up. Im not very good with arrays, so I will read up on them to see how they work. Once I understand them, I will fix up the script. Until then, this is what the final script looks like. This is the full script and not just a code. Im sure it can be optimized by using more efficient scripts, but for now, this is getting the job done. I scarpped the hotkey entirely, and just waited for the script to check for the log file creation. As soon as someone uses the command in game to save the log, it will create the file, which will in turn activate the script. expandcollapse popup#include <File.au3> $scriptname = @ScriptName $ini = StringReplace ( $scriptname, "exe", "ini" , -3, 0) If FileExists($ini) = 1 Then $var = FileReadLine(@ScriptDir & "" & $ini,2) $var = $var & "Chat" $chat = FileReadLine(@ScriptDir & "" & $ini,5) $chat = "Chat_" & $chat & ".txt" Else $var = FileSelectFolder("Select your RebirthRO game folder.", "") If @error = 1 Then Exit $answer = MsgBox(4, "RebirthRO Chat Tab name", "Have you renamed the chat tab that shows you @jump information to something other than General?") If $answer = 7 Then $tabname = "General" Else $tabname = InputBox("Chat Tab Name", "What is the chat tab name?") EndIf If @Error = 1 Then Exit EndIf FileOpen(@ScriptDir & "" & $ini, 1) FileWrite (@ScriptDir & "" & $ini, "[Game Folder Location]" & @CRLF ) FileWrite (@ScriptDir & "" & $ini, $var & @CRLF ) FileWrite (@ScriptDir & "" & $ini, ""& @CRLF ) FileWrite (@ScriptDir & "" & $ini, "[Chat Tab name]" & @CRLF ) FileWrite (@ScriptDir & "" & $ini, $tabname ) $var = FileReadLine(@ScriptDir & "" & $ini,2) $var = $var & "Chat" $chat = FileReadLine(@ScriptDir & "" & $ini,5) $chat = "Chat_" & $chat & ".txt" EndIf FileChangeDir ( $var ) Pause() Func Main() $CountLines = _FileCountLines($chat) While 1 $line = FileReadLine ( $chat , $CountLines) If NOT StringInStr ($line, "Jump to " , 1, 1, 1, 8) = 0 Then ExitLoop $CountLines = $CountLines -1 If $CountLines = 1 Then Pause() Wend While 1 $CountLines = $CountLines -1 $line = FileReadLine ( $chat , $CountLines) If NOT StringInStr ($line, "Jump to " , 1, 1, 1, 8) = 0 Then ExitLoop If $CountLines = 1 Then Pause() Wend $jump = StringReplace ( $line, "Jump to", "@jump" , 1, 0) Clipput ($jump) Pause() EndFunc Func Pause() FileDelete ("Chat_*") While 1 Sleep(80) If FileExists($chat) = 1 Then Main() WEnd EndFunc The one thing I would have liked to do was use the FileDelete command to delete only txt files starting with "Chat_". I tried a few things, and I could either use *.txt for all text files or Chat_* for all files starting with Chat_. But I couldnt use Chat_*.txt. Its not really a big deal, but as it stands there is like a one in a million chance that the user might browse for the wrong folder and accidently delete a file. I suppose that would come under user erorr, and I really doubt its ever gonna happen, but I would still like to know for future, on if its possible to use a wildcard like that.
Valik Posted July 20, 2012 Posted July 20, 2012 Steve... the next time you report a thread asking me to make sure it's okay, please don't do it when the post contains "code" this bad. It makes me want to cry to see code in such a state. The last language I used was Python which produces simple, elegant and beautiful code. Now you show me this massacre and I can no longer see those sanguine moonlit nights spent with Python no more than Frodo could see the Shire after being in possession of the One Ring for so long. Whether this breaks the rules or not is irrelevant. The code is so bad it's of no use to anyone in it's current state. I'm more than a little surprised it works at 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