Что нового

[Данные, строки] Поиск текста по патерну и выборка случайных не повторяющихся значений

krekerok

Новичок
Сообщения
10
Репутация
0
Добрый день.
Требуется помощь с реализацией следующей задачи.

Версия AutoIt: 3.3.14

Описание:
Есть открытая вкладка с интернет страничкой.
Надо найти среди всего текста только части вида: №?????????, где ????????? - 9 символов случайных цифр от 0 до 9; например, №260555192.
И записать только не повторяющиеся части в тектовый файл found.txt, каждую с новой строки.

Далее, случайно выбрать от 1 до 10 частей из текстового файла found.txt и сформировать строку, (допустим, выпало 4) вида: <<????????? <<????????? <<????????? <<?????????
Выбранные части занести в текстовый файл used.txt, а сформированную строку сохранить в переменную.
При последующем выборе не должно быть совпадений с файлом used.txt.

Примечания:
Открытие новых приложений \ окон не желательно, только если по-другому никак.

Пожалуйста, если вам нужна дополнительная информация - скажите.
Спасибо.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Пример текста можете дать ?
 
Автор
krekerok

krekerok

Новичок
Сообщения
10
Репутация
0
@ra40
Проверьте ЛС.
Скинул образец полностью, но из всего хлама полезны лишь строки вида:
Месье 26/02/16 Птн 14:30:22 №118014192 - где надо выделить части текста, подобные №118014192.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Далее, случайно выбрать от 1 до 10 частей из текстового файла found.txt .
Не понятно - сколько таких строк нужно сформировать ?
При последующем выборе не должно быть совпадений с файлом used.txt
Совпадать не должна вся сформированная строка или даже элементы этой строки не должны повторяться ?
Вот то, что уже есть
Код:
#include <File.au3>
#include <Array.au3>
#include <GUIConstants.au3>

$hMainGui = GUICreate('', 330, 50)
$But_Found = GUICtrlCreateButton('Поиск', 10, 10, 150, 30)
$But_Create = GUICtrlCreateButton('Создать строку', 170, 10, 150, 30)
GUISetState(@SW_SHOW, $hMainGui)

Global $sFile_Found = @ScriptDir & "\found.txt"
While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = $GUI_EVENT_CLOSE
			Exit
		Case $msg = $But_Found
			_Found()
		Case $msg = $But_Create
			_CreateString()
	EndSelect
WEnd

Func _Found()

	$sPath = FileOpenDialog('Выберите txt для обработки', @ScriptDir, 'text File (*.txt)', 3)
	If Not @error Then
		Local $aFile, $aRezult
		Dim $aRezult[0]
		_FileReadToArray($sPath, $aFile)
		Local $n = 0

		; Поиск № и запись результата в массив и файл....................
		For $i = 1 To $aFile[0]
			$str = StringRegExp($aFile[$i], '(?: №)([0-9]{9})', 1)
			If Not @error Then ;Найдена строка с №
				If _ArraySearch($aRezult, $str[0]) < 0 Then
					$n += 1
					ReDim $aRezult[$n]
					$aRezult[$n - 1] = $str[0]
				EndIf
			EndIf
		Next
		_FileWriteFromArray($sFile_Found, $aRezult)
		;................................................................
	EndIf

EndFunc   ;==>_Found

Func _CreateString()
	;Формирование случайных строк ...................................
	Local $aFoundFile, $iMax
	Local $sPath_Used = @ScriptDir & '\used.txt'

	_FileReadToArray($sFile_Found, $aFoundFile)

	If Not @error Then
		If Not FileExists($aFoundFile) Then _FileCreate($aFoundFile)

		If $aFoundFile[0] > 10 Then $iMax = 10
		Local $iNumber = Random(1, $iMax, 1)
		Local $sString = ''
		For $i = 1 To $iNumber
			$sSubString = ' <<<' & $aFoundFile[Random(1, $aFoundFile[0], 1)]
			$sString &= $sSubString
		Next

		$hFile = FileOpen($sPath_Used, 1)
		FileWriteLine($hFile, $sString)
		FileClose($hFile)
		MsgBox(48, 'Готово !', 'Строка создана и записана !', 1)
		;................................................................
	Else
		MsgBox(48, 'Ошибка !', 'Ошибка чтения файла' & @CRLF & $sFile_Found)
	EndIf

EndFunc   ;==>_CreateString
 
Автор
krekerok

krekerok

Новичок
Сообщения
10
Репутация
0
ra4o сказал(а):
Далее, случайно выбрать от 1 до 10 частей из текстового файла found.txt .
Не понятно - сколько таких строк нужно сформировать ?
Одну строку, содержащую от 1 до 10 случайных частей из файла found.txt:
1) по рандому выпало, допустим, 5;
2) дёргаем 5 случайных (различных) частей из файла found.txt;
2.1) проверяем, встречаются ли они в файле used.txt: если встречаются - берём новые;
3) создаём одну строку вида (т.к. выпало 5):
Код:
<<245789532 <<392598742 <<772182645 <<269551783 <<11268798

3.1) Выбранные элементы для формирования строки - случайны, и не имеют совпадений с файлом used.txt.
ra4o сказал(а):
При последующем выборе не должно быть совпадений с файлом used.txt
Совпадать не должна вся сформированная строка или даже элементы этой строки не должны повторяться ?
При формировании строки её элементы должны быть случайно выбраны из файла found.txt и не повторяться.
Пример - выше.

UPD:
Не могли бы вы переделать ваш пример под случай, когда файл с образцом текста уже есть? Попробовал переделать - наткнулся на многочисленные ошибки необъявленных переменных и обработки массивов.
Код:
Func _Found()

	    Local $aFile, $aRezult, $n = 0, $sCopyPaste
        Dim $aRezult[0]

        MouseClick ( "Left" , $x33, $y33, 1) ; клик в пустое место
        Send("^a")
		Send("^{INS}")
        ;Send("^c")
		$sCopyPaste = ClipGet()
        FileWrite('copypaste.txt', $sCopyPaste)

        $aFile = FileReadToArray('copypaste.txt')

        ; Поиск № и запись результата в массив и файл....................
        For $i = 1 To $aFile[0]
            $str = StringRegExp($aFile[$i], '(?: №)([0-9]{9})', 1)
            If Not @error Then ;Найдена строка с №
                If _ArraySearch($aRezult, $str[0]) < 0 Then
                    $n += 1
                    ReDim $aRezult[$n]
                    $aRezult[$n - 1] = $str[0]
                EndIf
            EndIf
        Next
        _FileWriteFromArray(@ScriptDir & '\found.txt', $aRezult)
        ;................................................................

EndFunc   ;==>_Found

И в файл used.txt должны заноситься не строки, а номера, которые были использованы для создания этих строк.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Изменил
Код:
#include <File.au3>
#include <Array.au3>
#include <GUIConstants.au3>

$hMainGui = GUICreate('', 330, 50)
$But_Found = GUICtrlCreateButton('Поиск', 10, 10, 150, 30)
$But_Create = GUICtrlCreateButton('Создать строку', 170, 10, 150, 30)
GUISetState(@SW_SHOW, $hMainGui)

Global $sFile_Found = @ScriptDir & "\found.txt"
While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = $GUI_EVENT_CLOSE
			Exit
		Case $msg = $But_Found
			_Found()
		Case $msg = $But_Create
			_CreateString()
	EndSelect
WEnd

Func _Found()

	$sPath = FileOpenDialog('Выберите txt для обработки', @ScriptDir, 'text File (*.txt)', 3)
	If Not @error Then
		Local $aFile, $aRezult
		Dim $aRezult[0]
		_FileReadToArray($sPath, $aFile)
		Local $n = 0

		; Поиск № и запись результата в массив и файл....................
		For $i = 1 To $aFile[0]
			$str = StringRegExp($aFile[$i], '(?: №)([0-9]{9})', 1)
			If Not @error Then ;Найдена строка с №
				If _ArraySearch($aRezult, $str[0]) < 0 Then
					$n += 1
					ReDim $aRezult[$n]
					$aRezult[$n - 1] = $str[0]
				EndIf
			EndIf
		Next
		$hFileFound = FileOpen($sFile_Found, 2)
		_FileWriteFromArray($hFileFound, $aRezult)
		FileClose($hFileFound)
		MsgBox(48, 'Внимание !', 'Обработка файла ' & @CRLF & $sPath & @CRLF & ' завершена !', 5)
		;................................................................
	EndIf

EndFunc   ;==>_Found

Func _CreateString()
	;Формирование случайных строк ...................................
	Local $aFoundFile, $iMax, $aString_Used
	Local $sPath_Used = @ScriptDir & '\used.txt'

	_FileReadToArray($sFile_Found, $aFoundFile)

	If Not @error Then
		If Not FileExists($aFoundFile) Then _FileCreate($aFoundFile)
		If Not FileExists($sPath_Used) Then _FileCreate($sPath_Used)
		$hFile = FileOpen($sPath_Used, 1)
		_FileReadToArray($sPath_Used, $aString_Used)

		If $aFoundFile[0] > 10 Then
			$iMax = 10
		Else
			$iMax = $aFoundFile[0]
		EndIf

		Local $iNumber = Random(1, $iMax, 1);Случайное кол-во элементов в строке
		Local $sString = ''

		Local $x = 0 ;Количество выбраных элементов

		While $x < $iNumber
			If _FileCountLines($sPath_Used) = _FileCountLines($sFile_Found) Then
				MsgBox(48, 'Внимание !', 'Строк для выбора больше нет !', 5)
				ExitLoop
			EndIf

			$sPart = $aFoundFile[Random(1, $aFoundFile[0], 1)]
			If _ArraySearch($aString_Used, $sPart) < 1 Then
				FileWriteLine($hFile, $sPart)
				_ArrayAdd($aString_Used, $sPart)
				$sSubString = ' <<<' & $sPart
				$sString &= $sSubString
				$x += 1
			EndIf
		WEnd

		FileClose($hFile)
		MsgBox(48, 'Готово !', 'Строка ' & @CRLF & $sString, 1)
		;................................................................
	Else
		MsgBox(48, 'Ошибка !', 'Ошибка чтения файла' & @CRLF & $sFile_Found)
	EndIf

EndFunc   ;==>_CreateString
под случай, когда файл с образцом текста уже есть?
Что есть файл с "образцом текста " ? В скрипте всего две кнопки :"Поиск" - поиск и запись не повторяющихся номеров из указанного вами файла ... любого и "Создать строку" - собственно создание случайной строки из сформированного ранее файла и запись элементов строки в другой файл. При каждом "Поиске" созданный ранее файл заменяется новыми данными из поиска.
 
Автор
krekerok

krekerok

Новичок
Сообщения
10
Репутация
0
ra4o сказал(а):
под случай, когда файл с образцом текста уже есть?
Что есть файл с "образцом текста " ?
Предполагается такая последовательность:
1) выделили весь текст на текущей вкладке;
2) скопировали в буфер обмена;
3) вставили в текстовый файл (или сразу в массив, если это возможно);
4) обработали записанный файл (массив) вашими функциями.

Выбирать каждый раз файл через менюшки и клацать по кнопкам возможности нет.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Ясно. Можно переделать вообще без GUI , а нужные функции выбирать по HotKey.
Вот
Код:
#include <File.au3>
#include <Array.au3>
#include <GUIConstants.au3>

HotKeySet('!c', '_Found')
HotKeySet('!v', '_CreateString')
HotKeySet('!q', '_Exit')

Global $sFile_Found = @ScriptDir & "\found.txt"
While 1
	Sleep(20)
WEnd

Func _Exit()
	Exit
EndFunc   ;==>_Exit

Func _Found()

	Local $aFile, $aRezult
	Dim $aRezult[0]
	Local $x33 = 500, $y33 = 300


	MouseClick("Left", $x33, $y33, 1) ; клик в пустое место
	Send("^a")
	Send("^{INS}")
	Send("^c")
	$sCopyPaste = ClipGet()
	FileWrite(@ScriptDir & '\copypaste.txt', $sCopyPaste)
	_FileReadToArray(@ScriptDir & '\copypaste.txt', $aFile)

	If Not @error Then

		Local $n = 0

		; Поиск № и запись результата в массив и файл....................
		For $i = 1 To $aFile[0]
			$str = StringRegExp($aFile[$i], '(?: №)([0-9]{9})', 1)
			If Not @error Then ;Найдена строка с №
				If _ArraySearch($aRezult, $str[0]) < 0 Then
					$n += 1
					ReDim $aRezult[$n]
					$aRezult[$n - 1] = $str[0]
				EndIf
			EndIf
		Next
		$hFileFound = FileOpen($sFile_Found, 2)
		_FileWriteFromArray($hFileFound, $aRezult)
		FileClose($hFileFound)
		MsgBox(48, 'Внимание !', 'Обработка файла ' & @CRLF & @ScriptDir & '\copypaste.txt' & @CRLF & ' завершена !', 5)
		;................................................................
	EndIf

EndFunc   ;==>_Found

Func _CreateString()
	;Формирование случайных строк ...................................
	Local $aFoundFile, $iMax, $aString_Used
	Local $sPath_Used = @ScriptDir & '\used.txt'

	_FileReadToArray($sFile_Found, $aFoundFile)

	If Not @error Then
		If Not FileExists($aFoundFile) Then _FileCreate($aFoundFile)
		If Not FileExists($sPath_Used) Then _FileCreate($sPath_Used)
		$hFile = FileOpen($sPath_Used, 1)
		_FileReadToArray($sPath_Used, $aString_Used)

		If $aFoundFile[0] > 10 Then
			$iMax = 10
		Else
			$iMax = $aFoundFile[0]
		EndIf

		Local $iNumber = Random(1, $iMax, 1);Случайное кол-во элементов в строке
		Local $sString = ''

		Local $x = 0 ;Количество выбраных элементов

		While $x < $iNumber
			If _FileCountLines($sPath_Used) = _FileCountLines($sFile_Found) Then
				MsgBox(48, 'Внимание !', 'Строк для выбора больше нет !', 5)
				ExitLoop
			EndIf

			$sPart = $aFoundFile[Random(1, $aFoundFile[0], 1)]
			If _ArraySearch($aString_Used, $sPart) < 1 Then
				FileWriteLine($hFile, $sPart)
				_ArrayAdd($aString_Used, $sPart)
				$sSubString = ' <<<' & $sPart
				$sString &= $sSubString
				$x += 1
			EndIf
		WEnd

		FileClose($hFile)
		MsgBox(48, 'Готово !', 'Строка ' & @CRLF & $sString, 1)
		;................................................................
	Else
		MsgBox(48, 'Ошибка !', 'Ошибка чтения файла' & @CRLF & $sFile_Found)
	EndIf

EndFunc   ;==>_CreateString
HotKey : Alt+c Копирование страницы, запись в файл и поиск номеров
Alt+v Создание случайной строки итп
Alt+q завершение работы скрипта
 
Автор
krekerok

krekerok

Новичок
Сообщения
10
Репутация
0

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
А вот это лишнее. Функции можно вызывать когда они потребуются просто по "имени"
А кто их вызывать будет ?
Постом выше - вариант без GUI , c HotKey, если HotKey лишние, просто их удалите .
 
Автор
krekerok

krekerok

Новичок
Сообщения
10
Репутация
0
@ra40
Вроде работает.

А можете ещё добавить проверку на совпадения в файле found.txt?
Чтобы в него записывались только новые значения, а не все найденные:
1) спарсили строку
2) нашли №
2.1) если номер уже есть в found.txt - не пишем его
2.2) номер в в found.txt нет - пишем

Дописал:
Код:
$sReadRepliesFile = FileRead($sFile_Found)
		For $k = 1 To UBound($aRezult) - 1 Step +1
		   $str2 = $aRezult[$k]
		   If Not StringInStr($sReadRepliesFile, $str2) Then FileWriteLine($sFile_Found, $str2)
	    Next
        MsgBox(48, 'Внимание !', 'Обработка файла ' & @CRLF & @ScriptDir & '\copypaste.txt' & @CRLF & ' завершена !', 0.5)
 
Верх