1 (изменено: Veranda, 2016-07-18 17:58:47)

Тема: AHK: Определение границ массива

Доброго дня, уважаемые форумчане!
Столкнулся с проблемой: для работы скрипта подключаю внешний файл, в котором есть 16 строк. Строки вызываю через random, с ограничением диапазона чтения строк с 1 по 14
Каким образом можно отказаться от необходимости указывать в параметрах переменно varrandom количество строк, из списка которых необходимо вывести строку со значением? Т.е чтобы пр добавлении новых строк в файл - они наравне с уже имеющимися участвовали в поиске и ненужно было изменять значение верхней границы массива строк в файле?

Была мысль сверять количество символов в строке при генерации varrandom и если их количество=0 - то происходит повторная генерация, пока в переменной не окажется строка с количеством символов >0. Однако данное решение мне кажется не очень удачным.


random, varrandom, 1, 14
FileReadLine, OutputVar, Test.txt, %varrandom% ;путь к файлу
MsgBox, Текущее значение:`n%OutputVar%
Чем дальше в лес - тем дальше в лес...

2

Re: AHK: Определение границ массива

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

3 (изменено: Veranda, 2016-07-18 18:00:52)

Re: AHK: Определение границ массива

Файл Test прилагаю. Представляет из себя 14 строк с разными значениями для вывода в MsgBox.

Post's attachments

Test.txt 40 b, 5 downloads since 2016-07-18 

You don't have the permssions to download the attachments of this post.
Чем дальше в лес - тем дальше в лес...

4

Re: AHK: Определение границ массива

Можно посчитать количество строк в файле до вызова random.

5 (изменено: Flasher, 2016-07-18 18:43:41)

Re: AHK: Определение границ массива

Первую строку заменить на:

FileRead, All, Test.txt
random, varrandom, 1, StrLen(RegExReplace(All, "[^\r\n]"))/2 + 1

6

Re: AHK: Определение границ массива

А зачем два раза файл читать?

random, varrandom, 1, % (objList := StrSplit(FileOpen("Test.txt","r").Read(),"`r`n")).Length()
MsgBox % objList[varrandom]

7

Re: AHK: Определение границ массива

Можно так ещё:

FileRead, All, test.txt
Sort, All, Random
msgbox % RegExReplace(All, "\R.*")

8

Re: AHK: Определение границ массива

Благодарю за помощь! Все варианты поробовал, но остановился на решении от Malcev из предыдущего сообщения.

Чем дальше в лес - тем дальше в лес...

9

Re: AHK: Определение границ массива

Кто-нибудь переведите, в чём задача вообще заключалась?

10

Re: AHK: Определение границ массива

ypppu
В файле неизвестное кол-во строк, необходимо рандомно вывести одну из строк.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

11

Re: AHK: Определение границ массива

Ещё такой вариант.

Loop, Read, Test.txt
{
line%A_Index% := A_LoopReadLine
last_line := A_Index
}
Random, varrandom, 1, last_line
MsgBox,  % line%varrandom%

12 (изменено: KusochekDobra, 2016-07-19 04:26:52)

Re: AHK: Определение границ массива


fileSize := 0
position := 0
file := FileOpen("Test.txt", "r", "UTF-8")
strArray := []
arrCount := 0
while (true) {
	if (file.Length > fileSize) {
		fileSize := file.Length
		file.Seek(position)
		line := file.ReadLine()
		while (line != "") {
			strArray.Push(line)
			line := file.ReadLine()
		}
		position := file.Tell()
		arrCount := strArray.Length()
	}
	sleep 100
}

Такая конструкция прочитает "Test.txt", положит прочитанные строки в массив "strArray", сообщит переменной "arrCount" верхнее значение массива и раз в 100 миллисекунд будет проверять размер "Test.txt". Если размер увеличится, новые строки будут добавлены в массив "strArray", а переменная "arrCount" получит новое предельное значение.