Search for text in file: Difference between revisions
From NSIS Wiki
Jump to navigationJump to search
(→Usage) |
|||
(5 intermediate revisions by 2 users not shown) | |||
Line 6: | Line 6: | ||
<b>Changes:</b> | <b>Changes:</b> | ||
13th January 2006 - Added ClearErrors (thanks Jenner Modesto) | 13th January 2006 - Added ClearErrors (thanks Jenner Modesto) | ||
13th July 2007 - Re-written. | |||
15th December 2015 - Added functionallity for specific occurance line print | |||
== Usage == | == Usage == | ||
Line 11: | Line 13: | ||
Push C:\temp1.txt | Push C:\temp1.txt | ||
Push hello | Push hello | ||
Push 1 # line should be displayed for occurance number of the searched string, if empty string is passed or 0 the last occurance will be displayed | |||
Call FileSearch | Call FileSearch | ||
Pop $2 # the line number the string was found for specified occurance number | |||
Pop $0 #Number of times found throughout | Pop $0 #Number of times found throughout | ||
Pop $1 | Pop $1 #Number of lines found on | ||
StrCmp $0 0 +2 | |||
MessageBox MB_OK "$\"hello$\" string was found in the file $0 times on $1 lines and the first line was $2" | |||
StrCmp $ | |||
MessageBox MB_OK "$\"hello$\" was found in the file $0 times on $2 | |||
</highlight-nsis> | </highlight-nsis> | ||
Line 23: | Line 25: | ||
<highlight-nsis> | <highlight-nsis> | ||
Function FileSearch | Function FileSearch | ||
Pop $7 ;~~~~Piotrek occurance numberw | |||
Exch $R0 ;search for | Exch $R0 ;search for | ||
Exch | Exch | ||
Line 34: | Line 37: | ||
Push $R8 | Push $R8 | ||
Push $R9 | Push $R9 | ||
StrLen $R4 $R0 | StrLen $R4 $R0 | ||
StrCpy $R7 0 | StrCpy $R7 0 | ||
StrCpy $R8 0 | StrCpy $R8 0 | ||
;~~~~Piotrek start | |||
StrCpy $9 0 | |||
${If} $7 == "" | |||
StrCpy $7 0 ; occurence number user specified | |||
${EndIf} | |||
;~~~~Piotrek end | |||
ClearErrors | ClearErrors | ||
FileOpen $R2 $R1 r | FileOpen $R2 $R1 r | ||
IfErrors Done | IfErrors Done | ||
LoopRead: | LoopRead: | ||
ClearErrors | ClearErrors | ||
FileRead $R2 $R3 | FileRead $R2 $R3 | ||
IfErrors DoneRead | IfErrors DoneRead | ||
IntOp $9 $9 + 1 ;Piotrek | |||
IntOp $R7 $R7 + 1 | IntOp $R7 $R7 + 1 | ||
StrCpy $R5 -1 | StrCpy $R5 -1 | ||
StrCpy $R9 0 | StrCpy $R9 0 | ||
LoopParse: | LoopParse: | ||
IntOp $R5 $R5 + 1 | IntOp $R5 $R5 + 1 | ||
Line 59: | Line 69: | ||
IntOp $R7 $R7 - 1 | IntOp $R7 $R7 - 1 | ||
Goto LoopRead | Goto LoopRead | ||
StrCmp $R6 $R0 0 LoopParse | StrCmp $R6 $R0 0 LoopParse | ||
StrCpy $R9 1 | StrCpy $R9 1 | ||
IntOp $R8 $R8 + 1 | IntOp $R8 $R8 + 1 | ||
;~~~~Piotrek start | |||
${If} $R8 == $7 ;if occurence is specified - outputs a specified occurence if not last occurence is output] | |||
StrCpy $0 $9 | |||
StrCpy $7 "-1" | |||
${ElseIf} $7 == 0 | |||
StrCpy $0 $9 | |||
${EndIf} | |||
;~~~~Piotrek end | |||
Goto LoopParse | Goto LoopParse | ||
DoneRead: | DoneRead: | ||
FileClose $R2 | FileClose $R2 | ||
Line 69: | Line 88: | ||
StrCpy $R0 $R8 | StrCpy $R0 $R8 | ||
StrCpy $R1 $R7 | StrCpy $R1 $R7 | ||
Pop $R9 | Pop $R9 | ||
Pop $R8 | Pop $R8 | ||
Line 81: | Line 100: | ||
Exch | Exch | ||
Exch $R0 ;output count found | Exch $R0 ;output count found | ||
Push $0 ;You need to pop that out after function call as first parameter ````Piotrek | |||
FunctionEnd | FunctionEnd | ||
</highlight-nsis> | </highlight-nsis> |
Latest revision as of 07:28, 15 December 2015
Author: Afrow UK (talk, contrib) |
Description
This function will search in a file for the specified string, and return some values.
Changes: 13th January 2006 - Added ClearErrors (thanks Jenner Modesto) 13th July 2007 - Re-written. 15th December 2015 - Added functionallity for specific occurance line print
Usage
Push C:\temp1.txt Push hello Push 1 # line should be displayed for occurance number of the searched string, if empty string is passed or 0 the last occurance will be displayed Call FileSearch Pop $2 # the line number the string was found for specified occurance number Pop $0 #Number of times found throughout Pop $1 #Number of lines found on StrCmp $0 0 +2 MessageBox MB_OK "$\"hello$\" string was found in the file $0 times on $1 lines and the first line was $2"
The Function
Function FileSearch Pop $7 ;~~~~Piotrek occurance numberw Exch $R0 ;search for Exch Exch $R1 ;input file Push $R2 Push $R3 Push $R4 Push $R5 Push $R6 Push $R7 Push $R8 Push $R9 StrLen $R4 $R0 StrCpy $R7 0 StrCpy $R8 0 ;~~~~Piotrek start StrCpy $9 0 ${If} $7 == "" StrCpy $7 0 ; occurence number user specified ${EndIf} ;~~~~Piotrek end ClearErrors FileOpen $R2 $R1 r IfErrors Done LoopRead: ClearErrors FileRead $R2 $R3 IfErrors DoneRead IntOp $9 $9 + 1 ;Piotrek IntOp $R7 $R7 + 1 StrCpy $R5 -1 StrCpy $R9 0 LoopParse: IntOp $R5 $R5 + 1 StrCpy $R6 $R3 $R4 $R5 StrCmp $R6 "" 0 +4 StrCmp $R9 1 LoopRead IntOp $R7 $R7 - 1 Goto LoopRead StrCmp $R6 $R0 0 LoopParse StrCpy $R9 1 IntOp $R8 $R8 + 1 ;~~~~Piotrek start ${If} $R8 == $7 ;if occurence is specified - outputs a specified occurence if not last occurence is output] StrCpy $0 $9 StrCpy $7 "-1" ${ElseIf} $7 == 0 StrCpy $0 $9 ${EndIf} ;~~~~Piotrek end Goto LoopParse DoneRead: FileClose $R2 Done: StrCpy $R0 $R8 StrCpy $R1 $R7 Pop $R9 Pop $R8 Pop $R7 Pop $R6 Pop $R5 Pop $R4 Pop $R3 Pop $R2 Exch $R1 ;number of lines found on Exch Exch $R0 ;output count found Push $0 ;You need to pop that out after function call as first parameter ````Piotrek FunctionEnd
Written by me again for using with batch / log files.
Stu