1 (изменено: kolins, 2012-01-11 11:54:12)

Тема: VBS: Как найти текст в файле

Здравствуйте!
Делал поиск по форуму, читал многие варианты, но так и не понял, как искать разный текст в файле, и если текст найден, то выполнять действие?

Есть текстовый файл 123.txt
Необходимо:
Найти несколько текстовых строчек в этом файле,  и если одна из этих строчек будет найдена (могут и обе строчки присутствовать в файле,а могут и не присутствовать), тогда выполняем действие (наприме выдавать сообщение или запускать программу).

Пример:
файл 123.txt
Файл наполняется текстом и содержит в себе множество строчек

наш текст1
наш текст2
наш текст3
наш текст4
наш текст5
наш текст6
...
наш текст100

Необходимо проверить файл на наличие в нем "текст2" и "текст5".


Пробовал на основе этого написать своё, но ничего не получилось
Одну строчку ищет, а вот вторую нет.
Буду благодарен за помощь!

2

Re: VBS: Как найти текст в файле

findstr /c:"текст1" /c:"текст2" "файл" > nul && echo НАШЛИ!

Я конечно далек от мысли... (с)

3

Re: VBS: Как найти текст в файле

smaharbA пишет:

findstr /c:"текст1" /c:"текст2" "файл" > nul && echo НАШЛИ!

На vbs....

4

Re: VBS: Как найти текст в файле

Где то так:

msg="Этих строчек в файле нет"

If .... ="текст2" Then
     MsgBox "Нашли второй"
    msg=""
End If

If ... ="текст5" Then
     MsgBox "Нашли пятый"
     msg=""
End If

If msg <>"" Then
     MsgBox msg
End If

5 (изменено: kolins, 2012-01-11 11:56:08)

Re: VBS: Как найти текст в файле

chichva пишет:

Где то так:

В том то и дело, а что писать вместо "..."?

Там какая-то такая должна быть схема

      
Do While Not txtFile.AtEndOfLine
          If InStr(txtFile.ReadLine, текст2) Then 
               MsgBox "Нашли второй"
               Exit Do 
          Elseif InStr(txtFile.ReadLine, текст5) Then 
               Msgbox "Нашли пятый"
               Exit Do  
      Else Msgbox "Этих строчек в файле нет"
          End If 
     Loop
   txtFile.Close

6 (изменено: smaharbA, 2012-01-11 12:13:54)

Re: VBS: Как найти текст в файле

x=txtFile.ReadLine
If InStr(x, "текст2") Then
               MsgBox "Нашли второй"
               Exit Do
          Elseif InStr(x, "текст5") Then
               Msgbox "Нашли пятый"
               Exit Do 
      Else Msgbox "Этих строчек в файле нет"
          End If

Я конечно далек от мысли... (с)

7 (изменено: kolins, 2012-01-11 16:09:54)

Re: VBS: Как найти текст в файле

Не работает. Точнее работает, но выдает сразу "Этих строчек в файле нет".

[добавлено]

Скрипт работает, если 1я строчка в файле равна нашей искомой строке.
     

 Set objFSO = Createobject("Scripting.FileSystemObject") 
   Set txtFile = objFSO.OpenTextFile(FileName,1) 

x=txtFile.Readline

    Do While Not txtFile.AtEndOfStream
                If InStr(x, "текст2") Then 
                     MsgBox "Нашли второй"
                     Exit Do 
               Elseif InStr(x, "текст5") Then 
                     Msgbox "Нашли пятый"
                       Exit Do  
               Else Msgbox "Этих строчек в файле нет" 
          Exit Do
          End If
    Loop
   txtFile.Close
 End Sub

1я строчка в файле "текст5" - выдает сообщение "Нашли пятый".
1я строчка в файле "текст2" - выдает сообщение "Нашли второй".
1я строчка в файле "текст1" - выдает сообщение "Этих строчек в файле нет".

Получается, что проверяется только 1я строчка. Может быть я не тот что-то указал перед if?
Как решить проблему?

8

Re: VBS: Как найти текст в файле

1. Читать строку нужно в цикле.
2. В цикле Else лишний, т.к. если первая строка не совпадает ни с одним из вариантов, то происходит выход из цикла.

option explicit
Dim objFSO, txtFile, x, done
Set objFSO = Createobject("Scripting.FileSystemObject")
Set txtFile = objFSO.OpenTextFile("echo.txt",1)

Do While Not txtFile.AtEndOfStream
  x=txtFile.Readline
  If InStr(x, "текст2") Then
      MsgBox "Нашли второй"
      done = true
      Exit Do
    Elseif InStr(x, "текст5") Then
      Msgbox "Нашли пятый"
      done = true
      Exit Do
'    Else Msgbox "Этих строчек в файле нет"
'      Exit Do
  End If
Loop
If Not done Then Msgbox "Этих строчек в файле нет"
txtFile.Close

9

Re: VBS: Как найти текст в файле

BeS Yara пишет:

1. Читать строку нужно в цикле.
2. В цикле Else лишний, т.к. если первая строка не совпадает ни с одним из вариантов, то происходит выход из цикла.

Спасибо, работает. Понял свою ошибку - указывал лишний Else.
Ещё раз большое спасибо!!!

10

Re: VBS: Как найти текст в файле

Скажем так, условие было некорректно, т.к. проверка должна была срабатывать только в конце файла, а не на каждой строке
Ну и немаловажно - чтение было за пределами цикла, т.е. считывалась одна единственная строка. И без ошибочного Else цикл получался ещё и бесконечный(т.к. прочитали лишь первую строку, то AtEndOfStream не дождались бы).
Можно конец файла обработать и в цикле(тоже рабочий вариант):

option explicit
Dim objFSO, txtFile, x
Set objFSO = Createobject("Scripting.FileSystemObject")
Set txtFile = objFSO.OpenTextFile("echo.txt",1)

Do  While Not txtFile.AtEndOfStream
  x=txtFile.Readline
  If InStr(x, "текст2") Then
      MsgBox "Нашли второй"
      Exit Do
    Elseif InStr(x, "текст5") Then
      Msgbox "Нашли пятый"
      Exit Do
    ElseIf txtFile.AtEndOfStream Then Msgbox "Этих строчек в файле нет"
  End If
Loop

txtFile.Close

11 (изменено: delegbgk, 2016-04-07 13:06:58)

Re: VBS: Как найти текст в файле

BeS Yara
Подскажите пожалуйста, как решить такую нетривиальную задачу:
Есть файл: C:\names.txt, в нем около 5тыс строк с цифрами без разделителей(капс, пробелы, запятые и прочие), т.е. примерно следующее:

23254544
66544886
5466645465
4456645465
.............

Есть много файлов с расширениями .doc, .docx,xls,xlsx и .rtf с произвольными названиями (кириллическими, с пробелами в названии и.т.п). Все они находятся в папке C:\files\*
Я хочу написать скрипт, который будет проверять, присутствуют ли строки файла names.txt в документах и электронных таблицах которые находятся в папке C:\files\*.

Понимаю, что мне нужно огласить два массива: строки из файла names.txt  и файлы из папки C:\files\*.
Затем, огласив классы к которым эти массивы принадлежат, нужно огласить цикл внутри цикла с условием: если элемент массива names.txt найден в файле C:\files\1.doc, тогда вывести имя этого элемента и имя файла в лог C:\found.log в виде:


5466645465 in 1.doc

Иначе перейти к внешнему циклу т.е. к следующему файлу.
К сожалению, в vbs рублю на порядок хуже, чем в batch-скриптах, поэтому буду решать свою задачу под присмотром гуру. (Кстати, если у вас есть скрипт, решающий похожую задачу, буду очень благодарен за оказанную помощь).

Пока что имею простенький скрипт, который открывает указанный документ, ищет в нем указанную строку и выводит сообщение в соответствующий лог, который создается в текущей для скрипта папке:

dim oFso, oShell, oShellEnv
set oFso      = CreateObject("Scripting.FileSystemObject")
set oShell    = WScript.CreateObject("WScript.Shell")
sLogFile1 = sCurFolder & Date() & " FOUND"  & ".log" ' лог для найденой строчки
sLogFile2 = sCurFolder & Date() & " NOT FOUND"  & ".log" 'лог для не найденой строчки
set oTS1 = oFSO.CreateTextFile(sLogFile1, true) ' true - overwrite
set oTS2 = oFSO.CreateTextFile(sLogFile2, true) ' true - overwrite
Set objWord = CreateObject("Word.Application")
objWord.Visible = False

Set objDoc = objWord.Documents.Open("D:\111\1.doc")
Set objSelection = objWord.Selection

objSelection.Find.Text = "25477191"
objSelection.Find.Forward = TRUE
objSelection.Find.MatchWholeWord = TRUE

If objSelection.Find.Execute Then
    oTS1.WriteLine objSelection.Find.Text
Else
    oTS2.WriteLine objSelection.Find.Text
End If
objDoc.Close

Осталось совсем "ничего" , огласить 2 массива(для текстового файла, и для папки с документами) и подружить их в двух циклах: первый по очереди ищет строки из текстового файла в документе, второй(внешний) перебирает документы из массива(из папки).

12

Re: VBS: Как найти текст в файле

delegbgk
Там не массивы, а коллекции будут.
А зачем во второй лог писать всё, что не попало из 5000 строк? Это ж кошмар, какая могучая кучка получится.

13

Re: VBS: Как найти текст в файле

Flasher 2 лог - временно, чтобы можно было проанализировать работу скрипта(ну мне пока что, во всяком случае так проще).
"Там не массивы, а коллекции будут."
А можно пример "коллекции" привести? Вроде как косвенно ознакомился с основами vbs, но пока что о таком не слышал. Возможно есть более простое решение задачи?

14

Re: VBS: Как найти текст в файле

delegbgk пишет:

во всяком случае так проще

Проще - не проще, но при 500 файлах лог получится примерно с 2,5 млн строками размером до 0,5 Гб.

Вопрос: нужно искать каждое число в файлах отдельно или всё же для индикации присутствия достаточно найти первое попавшееся?

15

Re: VBS: Как найти текст в файле

Flasher


Вопрос: нужно искать каждое число в файлах отдельно или всё же для индикации присутствия достаточно найти первое попавшееся?

Думаю, "для индикации присутствия достаточно найти первое попавшееся" - так как нужно отсеять по списку файлы в которых, присутствует, хотя бы одна из строк указанная в списке, от файлов в которых нет ни одной из строк указанных в списке. И, наверное, такой способ на деле будет побыстрее первого (искать каждое число в файлах отдельно) так как при нахождении совпадения, скрипт будет переходить к следующему по очереди файлу.
Надеюсь, что понятно объяснил.

Проще - не проще, но при 500 файлах лог получится примерно с 2,5 млн строками размером до 0,5 Гб.

С этим уж точно не поспоришь ! Но я пока что на стадии изучения работы массивов и коллекций (Объект Scripting.Dictionary), если я удачно погуглил и нашел действительно то, на что вы мне указали. Поэтому уверенности в том что мой скрипт будет "правильно" обрабатывать 2-3 файла и находить в них строки из списка у меня нет. Но если, скрипт изначально будет работать без ошибок, тогда во втором логе изначально нет необходимости .

16

Re: VBS: Как найти текст в файле

delegbgk
Допустим (без Excel пока):

' Поиск строк в документах с выводом в лог

Option Explicit: Dim List, Folder, LogFile, FSO, Dict,_
ShAp, Word, Verb, LogStream, F, Items, I, Doc, Sel, Key

List = "C:\names.txt"         ' путь к списку нужных строк
Folder = "C:\files"           ' путь к папке с документами
LogFile = Date & " FOUND.log" ' имя лога рядом со скриптом

Set FSO  = CreateObject("Scripting.FileSystemObject")
Set Dict = CreateObject("Scripting.Dictionary")
Set ShAp = CreateObject("Shell.Application")
Set Word = CreateObject("Word.Application")
Word.Visible = False : Verb = "сформирован"
If FSO.FileExists(LogFile) Then Verb = "переписан"
Set LogStream = FSO.CreateTextFile(LogFile, True, True)
With FSO.OpenTextFile(List)
  Do : F = .ReadLine
    Dict.Add F, ""
  Loop Until .AtEndOfStream : .Close
End With

Set Items = ShAp.NameSpace(Folder).Items
Items.Filter 8256,  "*.doc;*.docx;*.rtf"
For Each I In Items
  If Left(I.Name, 2) <> "~$" Then
    Set Doc = Word.Documents.Open(I.Path, False, False)
    Set Sel = Word.Selection
    For Each Key In Dict.Keys
      Sel.Find.Text = CStr(Key) : Sel.Find.Forward = True
      Sel.Find.MatchWholeWord = True : If Sel.Find.Execute Then _
      LogStream.WriteLine CStr(Key) & " in " & I : Exit For
    Next : Doc.Close
  End If
Next : Word.Quit : LogStream.Close
If MsgBox("Лог файл " & Verb & ". Желаете открыть?", 4132,_
"Создание лога по наличию строк в файлах      ") = 6 Then _
ShAp.ControlPanelItem LogFile

17 (изменено: delegbgk, 2016-04-14 10:18:29)

Re: VBS: Как найти текст в файле

Огромное Вам спасибо за оказанную помощь! Скрипт отлично справляется с поставленной задачей, но почему-то "отказывается" обрабатывать определенные doc файлы. Причину мне пока не удалось обнаружить.  Просто викидывает ошибку "error on close", хотя файл не занят другим процессом или пользователем, вне зависимости от прав пользователя на файл или содержимое файла, также пробовал менять владельца и реквизиты самого документа - безрезультатно.
Думал что причина может быть в версии офиса или windows, но что на 10тке, что на хр результат тот же.

Post's attachments

notread.doc 71 kb, 2 downloads since 2016-04-14 

You don't have the permssions to download the attachments of this post.

18

Re: VBS: Как найти текст в файле

delegbgk
Тестировую на 7-ке. Никаких проблем с приложенным файлом. В процессах WINWORD.EXE нигде не весит?
Можете попробовать на 27 строке убрать ', False' с конца, но Find.Execute на моей версии Office без этого не работает.

19

Re: VBS: Как найти текст в файле

Может и мне поможете с моей задачей!
Требуется следующая тема:
1. Вывести содержание папки в файл new_folder.txt
1.1 если папка пустая, отправить письмо (test@tc.ru) что файлы отсутствуют
1.2 если отсутствует файл создать его
1.3 если содержит данные, переименовать его в old_folder.txt и отправить содержимое на почту (test@tc.ru)

2. Сравнить содержание файлов old_folder.txt и new_folder.txt
2.1 после сравнения определяем различия и отправляем письмо с содержимым (test@tc.ru)

как то так, помогите люди добрые у меня уже голова сломалась как это сделать

вот что пока наваял

Option Explicit
'On Error Resume Next
Dim FolderPath
Dim objFSO
Dim objFolder
Dim colFiles
Dim objFile
Dim tf
Dim WShell

FolderPath = "C:\file"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(FolderPath)
Set colFiles = objFolder.Files
Set tf = objFSO.CreateTextFile("C:\new_folder.txt", True)

For Each objFile in colFiles
	' Записать строку с переводом на новую строку.
	tf.WriteLine(objFile.Name) 
Next
tf.Close