Подсчёт к-ва раз встречающейся фразы в файле и вывод отчёта

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Аватара пользователя
Andrey_A
Сообщения: 394
Зарегистрирован: Пт апр 10, 2009 06:28
Откуда: Сочи
Контактная информация:

Подсчёт к-ва раз встречающейся фразы в файле и вывод отчёта

Сообщение Andrey_A »

Подскажите, как можно подсчитать сколько раз встречается в тестовом файле определённая фраза (кусок текста) и как вывести после этого отчёт: Текст .... встречается 55 раз

[mod="Avada"]Заголовок слегка поправлен.[/mod]
Аватара пользователя
Вахмурка
Сообщения: 2587
Зарегистрирован: Пн дек 27, 2004 14:47
Откуда: Большая деревня Москва
Контактная информация:

Сообщение Вахмурка »

Это вопрос явно не сюда, а в Программное обеспечение. Таких программ в сети пропасть (попробуй поискать в Яндексе по ключевым словам "текстологический анализ"). Я использую только одну функцию - удаление дубликатов строк. Помогает Text Duplicate Killer, хотя именно той функции, которую ты запрашиваешь, он не имеет.
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Аватара пользователя
Andrey_A
Сообщения: 394
Зарегистрирован: Пт апр 10, 2009 06:28
Откуда: Сочи
Контактная информация:

Сообщение Andrey_A »

Я задал вопрос именно сюда исходя из темы
http://forum.wincmd.ru/viewtopic.php?t= ... highlight=
где Tol!k блистательно ответил, и если бы и этот вопрос решался примерно подобным образом было бы великолепно, сторонний софт хорошо, но это много лишних нажатий и я пока не встречал подходящего
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Пробовал подобные программы?
глава HTML-анализатор писал(а):HTML-анализатор предоставляет также возможность получения обратных отчетов, то есть можно выбирать не страницу сайта для анализа, а фразу (слово) и просматривать ее параметры по всем разобранным страницам.
Аватара пользователя
Andrey_A
Сообщения: 394
Зарегистрирован: Пт апр 10, 2009 06:28
Откуда: Сочи
Контактная информация:

Сообщение Andrey_A »

Целый день потратил на поиск ответа в интернете. Накачал кучу сторонних тестовых утилит, но ни одна не удовлетворила. В конце наткнулся на статью о поиске строк с использованием батника. Пишу впервые, если что подправите, вот что получилось:

Код: Выделить всё

TOTALCMD#BAR#DATA
%ComSpec% /k echo Фраза "Button" встречается  в ...&
find "Button" /c /i %P%N &echo строках
shell32.dll,55
Подсчёт к-ва строк имеющих заданную фразу в файле под курсором


-1
Это решало задачу частично, и к тому же русскую фразу батник отказывался искать, как частный случай ещё одна кнопка:

Код: Выделить всё

TOTALCMD#BAR#DATA
%ComSpec% /k echo Пользовательские команды "em_" встречаются  в главном меню в &
find "em_and" /c "%%COMMANDER_PATH%%\Language\Wcmd_Rus.mnu" &echo строках
shell32.dll,55
Подсчёт к-ва строк имеющих заданную фразу в главном меню


-1
После 8 часов отыскивания информации на эту тему в нете, случайно наткнулся на скрипт, который искал к-во сочетаний «Кря» во введенном слове, а мне необходимо было в файле... я было забросил всё, как увидел тему "разрезания текстового файла"... спустя час, методом проб, ошибок и соединения этих двух скриптов у меня вылетело окно с подсчётом. Не судите строго, как это заработало я сам не понимаю, но кто хочет тот добьётся (если что подправите)

Код: Выделить всё

'===================================================================== 
' Подсчёт к-ва раз встречающейся фразы в файле и вывод отчёта
' 
' Параметры: 
' {файл} {фраза}
' 
' Пример вызова из TC: 
' %P%N "текст"
'=====================================================================
Dim fso, InFile, Stroka, ts, i, s, fstr

Set fso = CreateObject("Scripting.FileSystemObject") 
InFile = WScript.Arguments(0) 
fstr = WScript.Arguments(1) 
s = 0
Set ts=fso.OpenTextFile(InFile,1) 

Do Until ts.AtEndOfStream 
  Stroka=ts.ReadLine
   For i = 1 to (len(Stroka)-len(fstr)+1)
     If mid(Stroka,i,len(fstr))=fstr Then
	    s=s+1
     End If
  Next
Loop 

ts.Close 
Set ts=Nothing 
Set fso = Nothing 
msgbox "Фраза" & chr (34) & fstr & chr (34) & " повторяется в тексте" & str & " " & Cstr(s) & " раз(а)"
WScript.Quit
Спасибо Вахмурка и Tol!k за направление!
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

vbs-скрипт в файле с содержимым

Код: Выделить всё

test test test test
фразу "test test" находит 3 раза.

Вот такой батник

Код: Выделить всё

@echo off &chcp 1251 >nul
set "str=%~2"
set "str=%str:\=\\%"
set "str=%str:/=\/%"
set "str=%str:.=\.%"
set "str=%str: =\s%"
ssed.exe -n s/%str%/\n+1\n/pg "%~1" |ssed.exe -n /^^+1$/= |ssed.exe -n $=
находит 2 раза, но имеет проблемы с символом *
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Tol!k писал(а):фразу "test test" находит 3 раза.
1 и 2 слово - раз, 2 и 3 слово - два, 3 и 4 слово - три. Разве это не верно?
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

sa писал(а):Разве это не верно?
Давай не просто считать, а заменять найденное на, например, "нашёл". Сколько замен получится?
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Tol!k писал(а):Сколько замен получится?
Если искать в одном файле, а результаты изменений сохранять в другом, то замен будет три.
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

А что получится в рез-те обратной замены ("нашёл" на "test test") ?
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Tol!k писал(а):А что получится в рез-те обратной замены
Будет шесть "test".
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Не смущает, что в исходном файле было 4 ?
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Не смущает. Всё зависит от постановки задачи. Но скорее, упоминание в стартовом топике сочетания "кусок текста" говорит в пользу твоего варианта.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Andrey_A писал(а):если что подправите
Подправил:

Код: Выделить всё

'=====================================================================
' Подсчёт к-ва раз встречающейся фразы в файле и вывод отчёта
'
' Параметры:
' {файл} {фраза}
'
' Пример вызова из TC:
' %P%N "текст"
'=====================================================================
Dim fso, InFile, fstr, L

InFile  = WScript.Arguments(0)
fstr    = WScript.Arguments(1)
L       = Len(fstr)
s       = 0
Set fso = CreateObject("Scripting.FileSystemObject")

s = Find(fso.OpenTextFile(InFile,1).ReadAll, fstr)

Set fso = Nothing
msgbox "Фраза """ & fstr & """ повторяется в тексте " & s & " раз(а)"
WScript.Quit

Function Find(pStr, pFStr)
  Dim lp
  Find = 0
  lp = InStr(1, pStr, pFStr, 1)
  If lp > 0 Then Find = Find(Mid(pStr, lp + L + 1), pFStr) + 1
End Function
Andrey_A
В связи со спором Tol!k и sa, хочется уточнить - для варианта поиска "test test" в "test test test test" для тебя какое значение является правильным? Сейчас я сделал скрипт в согласии с Tol!k-ом.
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

Вариация

Код: Выделить всё

'=====================================================================
' Подсчёт к-ва раз встречающейся фразы в файле и вывод отчёта
'
' Параметры:
' {файл} {фраза}
'
' Пример вызова из TC:
' %P%N "текст"
'=====================================================================
Dim fso, InFile

Set fso = CreateObject("Scripting.FileSystemObject")

Dim re

Set re = New RegExp
re.Global = True
re.IgnoreCase = True
re.MultiLine = True

InFile     = WScript.Arguments(0)
re.Pattern = WScript.Arguments(1)

s = re.Execute(fso.OpenTextFile(InFile,1).ReadAll).Count

msgbox "Фраза """ & re.Pattern & """ повторяется в тексте " & s & " раз(а)"
Set fso = Nothing
Set re = Nothing
WScript.Quit
Ответить