MS Word search strings – търсене на думи в Word файлове

Проста програмка за търсене на думи в MS Word файлове. Програмата е само за 32-bit Windows. Тествана е само под WinXP, но може би ще работи и под други OS.
Писана само за трнировка. Разполага само с базови възможности. Би могло да и се добавят доста повече опции, като рекурсивно преравяне на директории, търсене на кирилица, търсене с регулярни изрази, запазване на резултата в текстов файл и т.н. Към момента ги няма тия дивотии, но ако ми текне музата някой ден може и да я пооправя. Използвал съм 2 езика за програмиране – AutoIt и Perl. Използвах компилатор-пакетера pp, за да компилирам Perl-файла.

Програмата е с отворен код и ако на някой му се занимава, може да си я пипне. Изглежда така:
MS Word Search
Сорс кода:
AutoIt-файла

#include 
#include 
#include 
#include 
#include 
#include 
 
Local $line
 
$Form1 = GUICreate("Search in word files", 621, 473, 192, 124)
$Label2 = GUICtrlCreateLabel("Text to Find", 8, 13, 60, 23)
$Rezult = GUICtrlCreateEdit("", 8, 64, 609, 369)
; GUICtrlSetData(-1, "Edit1")
$String = GUICtrlCreateInput("", 80, 8, 393, 21)
$SelectDir = GUICtrlCreateButton("Select Dir", 8, 32, 65, 25)
$Directory = GUICtrlCreateInput("", 80, 32, 393, 21)
$Search = GUICtrlCreateButton("SEARCH", 480, 8, 137, 49)
$Help = GUICtrlCreateButton("?", 584, 440, 25, 25)
$Label1 = GUICtrlCreateLabel("--==[ Programming by Nedialko Voinigovski ]==--", 8, 448, 444, 17)
GUISetState(@SW_SHOW)
 
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $SelectDir
			_seldir()
		Case $Search
			_search()
		Case $Help
			_help()
	EndSwitch
WEnd
 
 
func _seldir()
	$outfolder = FileSelectFolder("Choose a folder.", "")
	GUICtrlSetData($Directory, $outfolder)
EndFunc
 
func _search()
$command = @comspec & ' /c ws.exe' & ' "' & GUICtrlRead($String) & '"' & ' "' & GUICtrlRead($Directory) & '"'
$cmd = Run($command, @WorkingDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
 
	$line = "Wait ..." & @CRLF
	While 1
		$line &= StdoutRead($cmd)
		If @error <> 0 Then ExitLoop
		Sleep(1000)
		GUICtrlSetData($Rezult, $line)
	WEnd
	$line &= "--------------------------" & @CRLF & "All done!"
	GUICtrlSetData($Rezult, $line)
EndFunc
 
func _help()
	MsgBox(0,"HELP","Програмата е комбинация от езиците за програмиране" &@CRLF& "AutoIt (за графичната част) и Perl (за ровичкането в Word-файловете)." &@CRLF&"Има възможност да се използват PCRE (perl регулярни изрази) за търсене в файловете, но " &@CRLF&"все още липсва добра поддръжка на кирилица."&@CRLF&@CRLF&"За да работи всичко нормално трябва и двете exe-та да са в една директория.")
EndFunc

Perl-файла, който върши съществената работа:

use Win32::OLE;
use Win32::OLE::Enum;
use Cwd 'abs_path';
 
$dir = $ARGV[1]; chdir $dir;
@files = <*.doc *.docx>;
$find = $ARGV[0];
 
 
 
foreach $file (@files) {
	$doc = Win32::OLE -> GetObject(abs_path($file));
	open (FH,">jgfd75w43589azwq210");
 
	$paragraphs = $doc->Paragraphs();
	$enumerate = new Win32::OLE::Enum($paragraphs);
	while(defined($paragraph = $enumerate->Next())){
		$text = $paragraph->{Range}->{Text};
		print FH "$text\n";
	}
	$doc->Close;
	close FH;
 
	open (FH,"<jgfd75w43589azwq210");
	while ($line = ) {
		if($line =~ m/$find/i){
			print "$find\t-->\t$ARGV[1]\\$file\n";
			last;
		}
	}
	close FH;
	unlink("jgfd75w43589azwq210");
}

Пакетите за Perl, които ми бяха необходими за компилирането:

gcc environment - 3.4.5 (mingw-vista special r3)
PAR Packager, version 1.009 (PAR version 1.002)

Компилирането на Perl стана елементарно. Просто написах в промпта:

pp search_in_word.pl

Програмата може да се изтегли от тук: MS Word Search

Leave a Reply

Your email address will not be published. Required fields are marked *

*