Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Поиск повторяющихся слов в тексте при помощи StringRegExp

Ответить
Настройки темы
[решено] Поиск повторяющихся слов в тексте при помощи StringRegExp

Пользователь


Сообщения: 74
Благодарности: 0

Профиль | Отправить PM | Цитировать


Привет всем!
Возможно ли используя функцию 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
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Проще всего — представлять текстовый файл как базу данных. Тогда можно, использовав, например, OLEDB с запросом вида «SELECT COUNT(Field3) AS TotalField3 GROUP Field3 ORDER BY TotalField3 DESC», определить наиболее часто встречающееся из «UserXX».

Отправлено: 13:08, 26-02-2014 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Как-то не дочитал:
Цитата support23:
p.s. желательно с примерами. »
читать дальше »
Код: Выделить весь код
AutoItSetOption("MustDeclareVars", 1)

Local Const $adOpenStatic = 3
Local Const $adLockOptimistic = 3
Local Const $adCmdText = 1

Local $sPathToSchema = "E:\Песочница\0365"
Local $sSourceFile   = "0001.txt"

Local $oRecordSet = ObjCreate("ADODB.Recordset")

If Not FileExists($sPathToSchema & "\") Then
	ConsoleWrite("Folder [" & $sPathToSchema & "] not found." & @CRLF)
	Exit(1)
EndIf

If Not FileExists($sPathToSchema & "\" & $sSourceFile) Then
	ConsoleWrite("Source file [" & $sSourceFile & "] not found." & @CRLF)
	Exit(2)
EndIf

CreateSchema($sPathToSchema & "\Schema.ini", $sSourceFile)

$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.Close
$oRecordSet = 0

RemoveSchema($sPathToSchema & "\Schema.ini")

Exit(0)
;=============================================================================

;=============================================================================
Func CreateSchema($sFullPathToSchemaIni, $sSourceFile)
	If FileExists($sFullPathToSchemaIni) Then
		FileDelete($sFullPathToSchemaIni)
	EndIf

	Local $hFile = FileOpen($sFullPathToSchemaIni, 2)

	FileWriteLine($hFile, "[" & $sSourceFile & "]")
	FileWriteLine($hFile, "ColNameHeader=False")
	FileWriteLine($hFile, "Format=Delimited( )")
	FileWriteLine($hFile, "TextDelimiter=none")
	FileWriteLine($hFile, "DateTimeFormat=dd.mm.yyyy")
	FileWriteLine($hFile, "CharacterSet=ANSI")
	FileWriteLine($hFile, "Col1=Date date")
	FileWriteLine($hFile, "Col2=Time char")
	FileWriteLine($hFile, "Col3=Name char")

	FileClose($hFile)

 	FileSetAttrib($sFullPathToSchemaIni, "+H")
EndFunc
;=============================================================================

;=============================================================================
Func RemoveSchema($sFullPathToSchemaIni)
	If FileExists($sFullPathToSchemaIni) Then
		FileDelete($sFullPathToSchemaIni)
	EndIf
EndFunc
;=============================================================================

Результат:
читать дальше »
Цитата:
Код: Выделить весь код
Name:  user2
Count: 6

P.S. Хорошо бы образец реального файла.
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:22, 26-02-2014 | #3


Пользователь


Сообщения: 74
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: 7z auth_users.7z
(1.8 Kb, 4 просмотров)

Файл во вложении

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

При выполнении кода с данным файлом получаю ошибку:

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
Благодарности: 8087

Профиль | Отправить PM | Цитировать


support23, достаточно переименовать «auth_users.log» в «auth_users.txt».

Отправлено: 15:43, 27-02-2014 | #5


Пользователь


Сообщения: 74
Благодарности: 0

Профиль | Отправить PM | Цитировать


Все отлично работает, благодарю за решение !

Отправлено: 08:04, 28-02-2014 | #6


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить 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
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо, тоже отличное решение, особенно с учетом бонуса)

Отправлено: 14:13, 28-02-2014 | #8


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить 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
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
support23, если нужен такой же «бонус» в приведённом мною коде, замените: »
Большое спасибо!

В обоих случаях получил функционал больше чем запрашивал изначально, Iska и madmasles вы очень помогли!

Отправлено: 17:28, 28-02-2014 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Поиск повторяющихся слов в тексте при помощи StringRegExp

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Офис и Текст - Какие программным средством составить рейтинг наиболее используемых слов в тексте? 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




 
Переход