Что нового

[Массивы] Пошаговое сравнение строчек массива на совпадение, работа с массивами

Redcut

Новичок
Сообщения
12
Репутация
0
Здравствуйте.
Требуется помощь в воплощении небольшой последовательности действий.
Буду благодарен, если кто-нибудь допилит запоротый код.

Версия AutoIt:
3.3.8.1

Описание:
Имеются два тектосвых (*.txt) файла, содержащие общие и ранее использованные данные вида:
Строка 1
Строка 2
....
Строка N

Необходимо выбрать случайное значение из файла, содержащего общие данные, и проверить, встречается ли выбранное значение в файле, сожержащем использованные ранее данные. Если выбранное значение встречается, то следует выбрать новое и осуществить проверку снова. Если выбранное значение не встречается, то занести его в переменную для последующей обработки в Send(?) и обновить файл, содержащий уже использованные данные, добавив выбранное значение в его конец.

Примечания:
Вот что имеется, но я совсем запутался.
Код:
Global $aNames, $aUsed

Func GetName($Name)
   _FileReadToArray(@ScriptDir & "\names.txt", $aNames) ; текстовый файл, содержащий список имён
   _FileReadToArray(@ScriptDir & "\used.txt", $aUsed) ; тектосвый файл, содержащий ранее использованные имена
   $aName = $aNames[Random(1, $aNames[0])]
   For $aName = 1 To $aUsed[0][0] ; 
	  _ArraySearch($aUsed, $aNames[$aName])
    If @error And $aName = $aUsed[$i] Then
   _ArrayAdd($aUsed, $aNames[$Name])
   $aUsed[0] += 1
EndIf
   Next
   _FileWriteFromArray("List_Combined.txt", $Used, 1)
   $Name = $aName
Exit
EndFunc

...

Send($Name) ; неправильно! не знаю, как вытащить значение из функции и передать его в Send
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Не совсем понял что нужно в конкретном идеале.
Код:
;~ #include<File.au3>
#include<Array.au3>
Global $aName,$aUse
Global $ValueString=__GetName("Здесь параметр состоящий только из числа")
Send($ValueString);Эмуляция нажатия строки которая будет возращена функцией в переменную $valuestring
Func __GetName($name)
;~ 	_FileReadToArray(@ScriptDir&"\name.txt",$aName)
	$aName=StringSplit(FileRead(@ScriptDir&"\name.txt"),@LF,2)
;~ 	_FileReadToArray(@ScriptDir&"\use.txt",$aUse)
	$aUse=StringSplit(FileRead(@ScriptDir&"\use.txt"),@LF,2)
	Local $nR=Random(1,UBound($aName)-1,1);При последнем параметре =1 Random возвратит число integer
	For $i=0 To UBound($aUse)-1
		If _ArraySearch($aUse,$aName[$nR]) Then
			_ArrayAdd($aUse,$aName[$name]);Из массива "вытащится" строка если параметр $name у функции будет иметь - именно число, типа int и в нем не будут присутствовать символы кроме числа
		EndIf
	Next
	FileWrite(@ScriptDir&"\List_combine.txt",__ATS($aUse))
	Return $nR;Возвращает из функции число составленное функцией Random
EndFunc
Func __ATS($array)
	Local $sRet
	For $i In $array
		$sRet&=$i&@CRLF
	Next
	Return $sRet
EndFunc
 
Автор
R

Redcut

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

Извиняюсь, ввёл в заблуждение: в файлах содержится символьная информация - любое сочетание символов. Например:
Fyodor_Sumkin
0X00?HAx0R
\Rocket/ M@n
Benjamin Franklin

А что именно непонятно?

Попытаюсь объяснить проще: из первого файла берём рандомную строку. Если строка уникальна (её нет во втором файле) - записываем её в конец второго файла и передаём в переменную. Содержимое этой переменной будет отправляться в поле ввода через Send. Если строка встречается во втором файле - выбираем новое случайное значение и снова проверяем на совпадение до тех пор, пока не наткнёмся на уникальную строку.

Ещё такой вопросец, а без создания нового файла никак? Может можно дописать в существующий.

Если есть предложение как сделать проще - пожалуйста.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Redcut,
Дайте примеры файлов.
 
Автор
R

Redcut

Новичок
Сообщения
12
Репутация
0
@ madmasles
Да, пожалуйста.
http://rghost.net/private/49877470/70786c438d23a2dd0f0ce048a920538c
По ссылке - файл с заполненными именами. Второй файл - Used.txt - изначально пуст. Значения в виде строк (каждая строка начинается с "новой строки") в него добавляются как только мы начинаем брать имена с файла Names.txt (т.к. совпадений нет, то имя записывается в файл и используется для ввода в форму; в следующий раз оно попадаться не должно).
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Так?
Код:
#include <File.au3>
#include <Array.au3>

Local $aRecords, $aRecordsNew

If Not _FileReadToArray(@ScriptDir & "\names.txt", $aRecords) Then
    MsgBox(4096, "Ошибка", " Ошибка чтения файла в массив     Ошибка = " & @error)
    Exit
EndIf

$aRecordsNew = _ArrayUnique($aRecords, 1, 1, 0, @LF)

For $i = 1 To UBound($aRecordsNew)-1
    ConsoleWrite('Строка: ' & $i&' '& $aRecordsNew[$i]&@LF)
Next

$hFile = FileOpen("name-2.txt", 1)

If $hFile = -1 Then
    MsgBox(4096, "Ошибка", "Невозможно открыть файл.")
    Exit
EndIf

For $i = 1 To UBound($aRecordsNew)-1
	FileWriteLine($hFile, $aRecordsNew[$i])
Next

FileClose($hFile)
 
Автор
R

Redcut

Новичок
Сообщения
12
Репутация
0
@ MnM
Если я правильно понял, то - нет, не так. Скрипт просто проверяет массив на совпадения и перезаписывает в файл без них.

У нас двай файла. Первый содержит полный список имён. Второй - которые уже использовались.
При запуске скрипта, функция должна выбрать такое имя из списка в файле Names.txt, которое не встречается в файле Ssed.txt. Изначально файл used.txt - пуст. Когда запускаем скрипт первый раз, то функция выбирает рандомное имя, допустим, John Silver и проверяет, есть ли такое в файле Used.txt. Но т.к. файл пуст, то это имя можно использовать для отправки в форму ерез Send, после чего записав это имя в Used.txt. Оно и будет превой строкой.

Когда функция будет запущена в следующий раз и по случайности будет выбрано снова John Silver - оно не должно пройти и надо выбрать новое имя, которое при выборе не окажется в Used.txt.

Я не знаю как объяснить по другому.

1) Взяли рандомное имя из первого файла (names.txt)
2) Проверили, есть ли оно во втором файле (used.txt)
2.1) Если его нет - заносим это имя в переменную для последующей отправки виа Send и записываем в конец второго файла (used.txt)
2.2) Если имя есть - снова выбираем случайное имя и снова проверяем на наличие во втором файле
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Redcut

Код:
#include <File.au3>

ConsoleWrite(GetName() & @CRLF)


Func GetName()
	Local $aTemp_1, $sText_2, $sName

	_FileReadToArray('names.txt', $aTemp_1)

	$sText_2 = FileRead('used.txt')

	While 1
		$sName = $aTemp_1[Random(1, UBound($aTemp_1) - 1, 1)]
		If Not StringInStr($sText_2, $sName) Then ExitLoop
	WEnd

	FileWriteLine('used.txt', $sName)

	Return $sName

EndFunc   ;==>GetName
 
Автор
R

Redcut

Новичок
Сообщения
12
Репутация
0
@ WSWR
Вроде то. Сейчас проверю.

@ All
Большое всем спасибо за проявленное участие. Для меня эта задачка сложновата.
Отдельная благодарность WSWR - скрипт работает.
 
Верх