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