1 (изменено: xsanekk, 2013-10-09 10:24:06)

Тема: VBS: Поиск строки в подкаталогах.

В продолжении темы: http://forum.script-coding.com/viewtopic.php?pid=75866#p75866


Есть папка, в ней находятся подкаталоги, в подкаталогах находятся файлы одинакового расширения, но разные имена. Необходимо найти какое количество раз повторяется заданное слово во всех файлах данного подкаталога, затем считать имя этого подкаталога и записать в текстовый файл, потом аналогично сделать в следующем каталоге и дописать в файл... Файл получится вида:
=======================
ИмяКаталога1; КоличествоСлов
ИмяКаталога2; КоличествоСлов
ИмяКаталогаN; КоличествоСлов
=======================
Общее количество слов: NNNN

2 (изменено: yuriy2000, 2013-10-10 05:50:12)

Re: VBS: Поиск строки в подкаталогах.

Что-то типа такого. Для вызова использовать Cscript.exe


Option Explicit
Public oFSO     : Set oFSO = CreateObject("Scripting.FileSystemObject")
Public iTotal : iTotal=0

if WScript.Arguments.Count<2 then
  WScript.Echo "Вызов: " & WScript.ScriptFullName & " HomeDir String"
  WScript.Echo "  где: "
  WScript.Echo "       HomeDir - начальный каталог"
  WScript.Echo "       String  - строка для поиска"

  Wscript.Quit
end if 


ProcessFolder(oFSO.GetFolder(WScript.Arguments(0)))
WScript.Echo " Итого: " & iTotal

Sub ProcessFolder(Folder)
   Dim iFCnt   
    ' рекурсивно просматриваем все подпапки

    Dim SubFolder
    For Each SubFolder In Folder.SubFolders
        ProcessFolder SubFolder
    Next

    ' обрабатываем каждый файл 
    Dim File
    For Each File  In Folder.Files
        iFCnt = FindWordCnt(File.Path,WScript.Arguments(1)) 
        if iFCnt>0 then 
             iTotal = iTotal + iFcnt
             WScript.Echo  File.Path & ":" &chr(9)& iFCnt
        end if
    Next

End Sub

Function FindWordCnt(sFileIn,strWord)
     Dim oFileIn, iCnt, sBuf, oMatch

     Set oFileIn = oFSO.OpenTextFile(sFileIn, 1)
     iCnt = 0
     With New RegExp
        .Global = True
        .IgnoreCase = True ' False для поиска с учетом регистра
    
        Do
            sBuf = oFileIn.ReadLine ' считываем строку из файла 
            .Pattern = strWord 
              if .Test(sBuf) then  
                 iCnt=iCnt + .Execute(sBuf).Count ' суммируем кол-во найденных слов
              end if
        Loop Until oFileIn.AtEndOfStream
    End With
        
    oFileIn.Close
    FindWordCnt = iCnt
End Function 

3

Re: VBS: Поиск строки в подкаталогах.

yuriy2000, а почему построчно, а не сразу весь текст?

4 (изменено: yuriy2000, 2013-10-10 06:02:01)

Re: VBS: Поиск строки в подкаталогах.

alexii пишет:

yuriy2000, а почему построчно, а не сразу весь текст?

Поскольку я не знаю какого размера файлы будут анализироваться.
Можно, конечно считать и весь файл сразу...


Function FindWordCnt(sFileIn,strWord)
     Dim oFileIn, iCnt, sBuf, oMatch

     iCnt = 0
     With New RegExp
        .Global = True
        .IgnoreCase = True ' False для поиска с учетом регистра
    
        Set oFileIn = oFSO.OpenTextFile(sFileIn, 1)
        sBuf = oFileIn.ReadAll ' считываем файл целиком
        oFileIn.Close

        .Pattern = strWord 
        if .Test(sBuf) then iCnt = .Execute(sBuf).Count ' суммируем кол-во найденных слов
    End With
        
    FindWordCnt = iCnt
End Function 

PS: Проверил на пачке из 3000 HTML файлов (каждый в среднем 5К)  разницы не заметил.

5

Re: VBS: Поиск строки в подкаталогах.

yuriy2000 пишет:

Поскольку я не знаю какого размера файлы будут анализироваться.

Спасибо, ясно.

PS: Проверил на пачке из 3000 HTML файлов (каждый в среднем 5К)  разницы не заметил.

+ открыть спойлер

Они случайно, не в одну строчку ? Если будет 3 файла по 5 Mb — будет заметнее .

6

Re: VBS: Поиск строки в подкаталогах.

Простите за глупый вопрос, но мне не понятно, где вставлять путь f:\AVT\PRJ\ и строка поиска (702)...

7 (изменено: yuriy2000, 2013-10-11 15:33:38)

Re: VBS: Поиск строки в подкаталогах.

xsanekk пишет:

Простите за глупый вопрос, но мне не понятно, где вставлять путь f:\AVT\PRJ\ и строка поиска (702)...

сохранить скрипт в файл (например 1.vbs) и запустить
cscript.exe 1.vbs "f:\AVT\PRJ\"  "702"

ну либо заменить в тексте скрипта
WScript.Arguments(0) на "f:\AVT\PRJ\"
WScript.Arguments(1) на "702"
тогда просто запускать
cscript.exe 1.vbs

да кстати, забыл сказать, поскольку для поиска использованы регулярные выражения, то некоторые символы могут быть восприняты как служебные - их нужно брать в квадратные скобки. Например для поиска строки "(702)" нужно указать
"[(]702[)]". Подробней о служ. символах см. http://www.script-coding.com/WSH/RegExp.html