|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Поиск повторяющихся слов в тексте при помощи StringRegExp |
|
|
[решено] Поиск повторяющихся слов в тексте при помощи StringRegExp
|
Пользователь Сообщения: 74 |
Привет всем!
Возможно ли используя функцию StringRegExp определить наиболее часто повторяющееся слово в тексте? Пример текста: 18.02.2014 15:58:13 user1 18.02.2014 17:30:58 user2 19.02.2014 12:54:34 user2 19.02.2014 13:14:28 user5 20.02.2014 14:59:43 user2 20.02.2014 16:31:05 user4 21.02.2014 11:47:27 user2 23.02.2014 12:21:25 user2 23.02.2014 10:35:14 user3 24.02.2014 13:50:20 user2 Слово для поиска - userX может содержать латинские буквы, цифры, символы "_" и "-" Если через StringRegExp этого сделать нельзя, какой еще метод можно использовать? p.s. желательно с примерами. Заранее спасибо! |
|
Отправлено: 12:53, 26-02-2014 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Проще всего — представлять текстовый файл как базу данных. Тогда можно, использовав, например, OLEDB с запросом вида «SELECT COUNT(Field3) AS TotalField3 GROUP Field3 ORDER BY TotalField3 DESC», определить наиболее часто встречающееся из «UserXX».
|
Отправлено: 13:08, 26-02-2014 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Как-то не дочитал:
Цитата support23:
Результат: P.S. Хорошо бы образец реального файла. |
|
Отправлено: 22:22, 26-02-2014 | #3 |
Пользователь Сообщения: 74
|
Профиль | Отправить PM | Цитировать Файл во вложении
При выполнении кода, на тексте для примера, указанного в первом сообщении, все работает При выполнении кода с данным файлом получаю ошибку: The requested action with this object has failed.: $oRecordSet.Open( "SELECT TOP 1 [Name], COUNT(*) AS [Count] " & "FROM [" & $sSourceFile & "] " & "GROUP BY [Name] " & "ORDER BY COUNT(*) DESC", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & $sPathToSchema & "';Extended Properties=""text;""", $adOpenStatic, $adLockOptimistic, $adCmdText ) $oRecordSet.Open( "SELECT TOP 1 [Name], COUNT(*) AS [Count] " & "FROM [" & $sSourceFile & "] " & "GROUP BY [Name] " & "ORDER BY COUNT(*) DESC", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & $sPathToSchema & "';Extended Properties=""text;""", $adOpenStatic, $adLockOptimistic, $adCmdText )^ ERROR |
Отправлено: 13:06, 27-02-2014 | #4 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать support23, достаточно переименовать «auth_users.log» в «auth_users.txt».
|
|
Отправлено: 15:43, 27-02-2014 | #5 |
Пользователь Сообщения: 74
|
Профиль | Отправить PM | Цитировать Все отлично работает, благодарю за решение !
|
Отправлено: 08:04, 28-02-2014 | #6 |
Ветеран Сообщения: 812
|
Профиль | Отправить PM | Цитировать support23,
Мой вариант. #include <Array.au3> Local $sFile = @ScriptDir & '\auth_users.log', $aTmp, $iUb, $oDict, $iTmp, $aMax[2], $aRes[1], $aKey, $aItem $aTmp = StringRegExp(FileRead($sFile), '(?<=:\d{2})\h{0,}([^\h]+?)[\n\r]', 3) If @error Then Exit 13 $iUb = UBound($aTmp) $oDict = ObjCreate('Scripting.Dictionary') For $i = 0 To $iUb - 1 If $oDict.Exists($aTmp[$i]) Then $iTmp = $oDict.Item($aTmp[$i]) + 1 $oDict.Item($aTmp[$i]) = $iTmp If $aMax[1] < $iTmp Then $aMax[1] = $iTmp $aMax[0] = $aTmp[$i] EndIf Else $oDict.Add($aTmp[$i], 1) EndIf Next ConsoleWrite('Max "' & $aMax[0] & '", count = ' & $aMax[1] & @LF) ;~ бонус: $iUb = $oDict.Count ReDim $aRes[$iUb + 1][2] $aKey = $oDict.Keys $aItem = $oDict.Items $aRes[0][0] = $aMax[0] $aRes[0][1] = $aMax[1] For $i = 0 To $iUb - 1 $aRes[$i + 1][0] = $aKey[$i] $aRes[$i + 1][1] = $aItem[$i] Next $oDict = 0 $aTmp = 0 $aMax = 0 _ArrayDisplay($aRes) ;~ в [0][0] массива: слово, всречающееся максимальное число раз ;~ в [0][1] массива: кол-во его вхождений ;~ в [1-n][0] массива: уникальные имена ;~ в [1-n][1] массива: кол-во их вхождений |
Последний раз редактировалось madmasles, 28-02-2014 в 12:10. Отправлено: 11:33, 28-02-2014 | #7 |
Пользователь Сообщения: 74
|
Профиль | Отправить PM | Цитировать Спасибо, тоже отличное решение, особенно с учетом бонуса)
|
Отправлено: 14:13, 28-02-2014 | #8 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать support23, если нужен такой же «бонус» в приведённом мною коде, замените:
$oRecordSet.Open( _ "SELECT TOP 1 [Name], COUNT(*) AS [Count] " & _ "FROM [" & $sSourceFile & "] " & _ "GROUP BY [Name] " & _ "ORDER BY COUNT(*) DESC", _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & $sPathToSchema & "';Extended Properties=""text;""", _ $adOpenStatic, $adLockOptimistic, $adCmdText _ ) ConsoleWrite("Name: " & $oRecordSet.Fields.Item("Name").Value & @CRLF) ConsoleWrite("Count: " & $oRecordSet.Fields.Item("Count").Value & @CRLF) $oRecordSet.Open( _ "SELECT [Name], COUNT(*) AS [Count] " & _ "FROM [" & $sSourceFile & "] " & _ "GROUP BY [Name] " & _ "ORDER BY COUNT(*) DESC", _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & $sPathToSchema & "';Extended Properties=""text;""", _ $adOpenStatic, $adLockOptimistic, $adCmdText _ ) While Not $oRecordSet.EOF ConsoleWrite("Count: " & $oRecordSet.Fields.Item("Count").Value & @TAB & "Name: " & $oRecordSet.Fields.Item("Name").Value & @CRLF) $oRecordSet.MoveNext() WEnd |
Отправлено: 16:04, 28-02-2014 | #9 |
Пользователь Сообщения: 74
|
Профиль | Отправить PM | Цитировать Цитата Iska:
В обоих случаях получил функционал больше чем запрашивал изначально, Iska и madmasles вы очень помогли! |
|
Отправлено: 17:28, 28-02-2014 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Офис и Текст - Какие программным средством составить рейтинг наиболее используемых слов в тексте? | eugrus | Программное обеспечение Windows | 0 | 01-01-2014 23:38 | |
2010 - как настроить подсчёт слов в тексте, просматриваемом в ворде? | Pavelasd | Microsoft Office (Word, Excel, Outlook и т.д.) | 2 | 01-12-2012 20:23 | |
C/C++ - [решено] Поиск слова в тексте,подскажите функцию | VokaMut | Программирование и базы данных | 2 | 10-01-2012 15:09 | |
Разное - Поиск количества строк в тексте | DaRiYs | Программирование и базы данных | 2 | 15-03-2010 16:24 | |
[решено] StringRegExp. Вытаскивание повторяющихся кусков кода HTML. | ikif | AutoIt | 7 | 06-12-2009 10:30 |
|