1 (изменено: Coffi, 2017-11-11 02:44:54)

Тема: AHK: Деление строки на подстроки

Всем привет, я порылся на форуме и нашёл это:

String := 12345678, Start := 1, Length := 5

loop
{
   if ((NewString := SubStr(String, Start, Length)) = "")
      break
   Send % NewString "{Enter}"
   Start+=Length
   Sleep 2000
}
msgbox done

Тут в скрипте переменная разделяется на части и вписывается. Мне нужно, чтобы эта переменная разбивалась на части словами, то есть перед каждым пробелом.
Пример:
Устав министерства обязан соблюдать каждый сотрудник.
Скрипт делает так:
Устав министерства обязан -
соблюдать каждый сотрудник.
Всем спасибо.

2

Re: AHK: Деление строки на подстроки

Если текст заранее известен то RegExMatch, если нет - Strrsplit.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

3

Re: AHK: Деление строки на подстроки

belyankin12, а как это сделать?

4

Re: AHK: Деление строки на подстроки

text := "Устав министерства обязан соблюдать каждый сотрудник"
var := StrSplit(text, A_Space)
Loop % var.MaxIndex() {
	msgbox, % var[A_Index]
}
Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

5

Re: AHK: Деление строки на подстроки

Coffi, почему тема называется "AHK: Чтение файла"? Ваш вопрос относится к делению строки на подстроки.

6

Re: AHK: Деление строки на подстроки

Ох у ж эти Samp-Rp'шники.

7

Re: AHK: Деление строки на подстроки

belyankin12, спасибо.
ypppu, исправил.
MandarinKa02, ахахах, это я просто тренируюсь делать скрипты, а так я не играю в самп.

8

Re: AHK: Деление строки на подстроки

Еще можно так:

text := "Устав министерства обязан соблюдать каждый сотрудник"
loop,parse,text,%a_space%
{
	MsgBox % a_loopfield
}

9

Re: AHK: Деление строки на подстроки

shahlik002, спасибо, но я не понимаю как эти два кода объединить. То есть:

String := 12345678, Start := 1, Length := 5

loop
{
   if ((NewString := SubStr(String, Start, Length)) = "")
      break
   Send % NewString "{Enter}"
   Start+=Length
   Sleep 2000
}
msgbox done

В вышеуказанном коде скрипт выполняет вставку текста, по количеству символов, то есть если макс. 10 символов и текст такой: "Всем привет с вами", то скрипт разделяет данный текст таким образом:
"Всем приве
т с вами"
В общем тут он просто разделяет текст по количеству символов. Я бы хотел сделать, чтобы он разделял на слово, тоже по количеству символов, то есть так:
"Всем
привет с
вами"
То есть, чтобы он разделял по максимально возможному количеству символов данный текст,  только по словам, до каждого пробела, берём этот код:

text := "Устав министерства обязан соблюдать каждый сотрудник"
loop,parse,text,%a_space%
{
	MsgBox % a_loopfield
}

Тут он просто разделяет данные слова по количеству пробелов, не совсем так, как надо.

10

Re: AHK: Деление строки на подстроки

Так и не понял что вы от меня хотите.
Если вводить переменную с текстом по частям , запинаясь на каждом пробеле, то код следующий:

text := "Устав министерства обязан соблюдать каждый сотрудник"
loop,parse,text,%a_space%
{
Send %a_loopfield%`n
sleep 1000
}

Если вы хотите заменить пробелы переводом строки, то

text := "Устав министерства обязан соблюдать каждый сотрудник"
StringReplace,text,text,%a_space%,`n,all
MsgBox % text

Если разделить переменную на множество переменных, то

text := "Устав министерства обязан соблюдать каждый сотрудник"
loop,parse,text,%a_space%
	c%A_Index%:=A_LoopField	
MsgBox c1=%c1%`nc2=%c2%`nc3=%c3%`nc4=%c4% 

Если и тут не угадал, то поставьте задачу как можно яснее....

11 (изменено: Coffi, 2017-11-19 23:32:33)

Re: AHK: Деление строки на подстроки

shahlik002, у нас есть предложение: "Устав министерства обязан соблюдать каждый сотрудник". Ограничение символов на строчку = 20. Тут больше всего подходит ваш этот вариант:

text := "Устав министерства обязан соблюдать каждый сотрудник"
loop,parse,text,%a_space%
{
Send %a_loopfield%`n
sleep 1000
}

Тут он вставляет по слову на каждую строчку, а у нас ограничение на каждую строку 20 символов. Скрипт должен вставить так:
Устав министерства
обязан соблюдать
каждый сотрудник
То есть идея заключается в следующем: Максимальное количество символов, которое может быть в одной строке = к примеру 20. Каждое слово = символы до каждого пробела. Он вставляет в одну строку такое макс. количество слов, чтобы они не превышали 20 символов. Если одно слово будет превышать 20 символов, то скрипт просто переносит его по символам. Ну как - то так. Вот ещё длинное предложение:
«Я́ндекс» — российская транснациональная компания, владеющая одноимённой системой поиска в Сети, интернет-порталами и службами в нескольких странах. Наиболее заметное положение занимает на рынках России, Турции, Белоруссии и Казахстана.
Устанавливаем переменную - макс. количество в одной строке = 30 символов.
Этот скрипт ниже он вставляет по символам, а не по словам:

String := "«Яндекс» — российская транснациональная компания, владеющая одноимённой системой поиска в Сети, интернет-порталами и службами в нескольких странах. Наиболее заметное положение занимает на рынках России, Турции, Белоруссии и Казахстана.", Start := 1, Length := 30

loop
{
   if ((NewString := SubStr(String, Start, Length)) = "")
      break
   Send % NewString "{Enter}"
   Start+=Length
}
msgbox done

То есть вывод такой:

«Яндекс» — российская транснац
иональная компания, владеющая
одноимённой системой поиска в
Сети, интернет-порталами и слу
жбами в нескольких странах. На
иболее заметное положение зани
мает на рынках России, Турции,
Белоруссии и Казахстана.

Видите тут сверху - не по словам перенос на следующую строку, а по символам.
Мне нужно, чтобы скрипт переносил по словам, то есть таким образом:

«Яндекс» — российская
транснациональная компания,
владеющая одноимённой
системой поиска в Сети,
интернет-порталами и службами
в нескольких странах. Наиболее
заметное положение занимает на
рынках России, Турции,
Белоруссии и Казахстана.

Должен быть результат как сверху, то есть перенос по словам. Очень надеюсь на вашу помощь .

12 (изменено: belyankin12, 2017-11-20 09:47:14)

Re: AHK: Деление строки на подстроки

Возможно очень костыльный вариант, но если я правильно понял вашу цель, то он её сможет достичь:

text := "Устав министерства обязан соблюдать каждый сотрудник"

Fun(text, arg) {
	Loop %arg% {
		if (A_Index = arg) {
			StringReplace, text, text, %A_Space%, `n
			StringReplace, text, text, @#$$, %A_Space%, All
		} else {
			StringReplace, text, text, %A_Space%, @#$$
		}
	}
	return, % text
}

msgbox, % fun(text, 3) ; 3 - номер слова, после которого начинается деление 
Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

13 (изменено: Coffi, 2017-11-20 10:55:32)

Re: AHK: Деление строки на подстроки

belyankin12, огромное спасибо за такой вариант, я изучил вашу функцию. Но я не понял, как сделать, чтобы он построчно вставлял данный текст, как здесь:

String := "«Яндекс» — российская транснациональная компания, владеющая одноимённой системой поиска в Сети, интернет-порталами и службами в нескольких странах. Наиболее заметное положение занимает на рынках России, Турции, Белоруссии и Казахстана.", Start := 1, Length := 30

loop
{
   if ((NewString := SubStr(String, Start, Length)) = "")
      break
   Send % NewString "{Enter}"
   Start+=Length
}
msgbox done

Подскажите пожалуйста, я не понимаю . А также, подскажите, как установить максимальное количество слов в каждую строку. Благодарю.

14

Re: AHK: Деление строки на подстроки

Что значит построчно? Я вижу единую строку. По какому принципу строка должна делиться на несколько?

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

15

Re: AHK: Деление строки на подстроки

Эта функция недописана мной. При проверке на маленьком тексте "ха ха ха ха ха ха ха" с попыткой добавить максимальное количество символов в строке 2 скрипт зацикливался намертво. Потому работает только с большими объемами текстов и большими аргументами. Сейчас у меня нет времени довести её до ума, потому доведите сами:

text := "«Яндекс» - российская транснациональная компания, владеющая одноимённой системой поиска в Сети, интернет-порталами и службами в нескольких странах. Наиболее заметное положение занимает на рынках России, Турции, Белоруссии и Казахстана."
Fun(text, arg) {
	Loop %arg% {
		if (A_Index = arg) {
			StringReplace, text, text, %A_Space%, `n
			StringReplace, text, text, @#$$, %A_Space%, All
		} else {
			StringReplace, text, text, %A_Space%, @#$$
		}
	}
	return, % text
}

ffunc(text, arg) {
	
	arr2 := []
	wtext := ""
	rtext := ""
	ttext := ""
	ns := 0
	
	StringReplace, wtext, text, %A_Space%, ©, All
	Loop, parse, wtext,, 
	{
		arr2[A_Index] := A_LoopField
	}
	While (arr2.MaxIndex() != "") {
		if (arr2[arg] = "©") {
			Loop %arg% {
				if (A_Index = arg) {
					rtext .= "`n"
					break
				}
				rtext .= arr2[A_Index]
			}
			arr2.Remove(1, arg)
		} else {
			Loop %arg% {
				ttext .= arr2[A_Index]
			}
			
			Loop, parse, ttext,,
			{
				if (A_LoopField = "©") {
					ns := A_Index
				}
			}
				
			Loop %ns% {
				if (A_Index = ns) {
					rtext .= "`n"
					break
				}
				rtext .= arr2[A_Index]
			}
			ttext := ""
			arr2.Remove(1, ns)
		}
	}
	StringReplace, rtext, rtext, ©, %A_Space%, all
	return, %rtext%
}

msgbox, % ffunc(text, 30)

А может кто и подскажет что-то поумнее, а то у меня набор костылей.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

16

Re: AHK: Деление строки на подстроки

belyankin12, а зачем вы используете StringReplace?

17

Re: AHK: Деление строки на подстроки

Мне так проще,  я понимаю что он совсем не обязательный,  но в msgbox проще увидеть спец. знак в конце строчки,  чем пробел.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

18

Re: AHK: Деление строки на подстроки

Он не то, что необязательный, он вредный.
Или по-вашему в тексте знак копирайта встречаться не может?

19

Re: AHK: Деление строки на подстроки

Знак копирайта можно поменять на любой другой экзотический. Просто этот знак единственный "экзотический" который я вспомнил и который не нужно было с какого-либо сайта копировать (альт + 0169) - использовался для создания функции.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

20

Re: AHK: Деление строки на подстроки

Ну и зачем эти ненадежные костыли?
Не проще ли действовать по такому алгоритму - разделять слова по знаку пробела, подсчитывать сколько в сумме букв и если меньше заданной, то присоединять к финальной переменной через пробел, а если больше, то через перенос строки?

21

Re: AHK: Деление строки на подстроки

Хороший алгоритм. Я не додумался суммировать количество символов в словах, я разделял просто по макс. кол-ву символов. Теперь вышло куда короче и работает даже на коротких текстах:

text := "«Яндекс» - российская транснациональная компания, владеющая одноимённой системой поиска в Сети, интернет-порталами и службами в нескольких странах. Наиболее заметное положение занимает на рынках России, Турции, Белоруссии и Казахстана."

Func(text, arg) {
	str := StrSplit(text, A_Space)
	rtext := ""
	ttext := ""
	
	While (str.MaxIndex() != "") {
		if (strlen(str[1]) = arg) {
			rtext .= "" . str[1] . "`n"
			str.Remove(1)
		} else if (strlen(str[1]) < arg) {
			ttext := str[1]
			str.Remove(1)
			Loop {
				var := strlen(ttext) + strlen(str[1]) + 1
				if (var = arg) {
					rtext .= "" . ttext . " " . str1 . "`n"
					str.Remove(1)
					ttext := ""
					break
				} else if (var < arg) {
					ttext .= " " . str[1] . ""
					str.Remove(1)
					continue
				} else {
					rtext .= "" . ttext . "`n"
					ttext := ""
					break
				}
			}
		} else {
			return, false
		}
	}
	return, %rtext%
}

msgbox, % func(text, 30)

Если количество символов от предыдущего до следующего пробела больше максимального количества символов, функция возвращает 0.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

22 (изменено: Coffi, 2017-11-20 20:09:53)

Re: AHK: Деление строки на подстроки

belyankin12 пишет:

Что значит построчно? Я вижу единую строку. По какому принципу строка должна делиться на несколько?

То есть, чтобы скрипт вставлял каждую строку построчно:

Text := "«Яндекс» - российская транснациональная компания, владеющая одноимённой системой поиска в Сети, интернет-порталами и службами в нескольких странах. Наиболее заметное положение занимает на рынках России, Турции, Белоруссии и Казахстана.

То есть он вставляет 1-ую строку через Send, - «Яндекс» - российская
Затем, например ждёт 100 мс. И вставляет след. строку - транснациональная компания,
И так далее:

«Яндекс» - российская
транснациональная компания,
владеющая одноимённой
поиска в Сети,
интернет-порталами и службами
в нескольких странах.
заметное положение занимает
рынках России, Турции,
Белоруссии и Казахстана.

23

Re: AHK: Деление строки на подстроки

Ну воспользуйтесь функцией повыше чтобы разделить единую строчку на несколько, а потом воспользуйтесь strsplit по `n в качестве разделителя и в цикле все отправляйте:


text := "123`n123`n123"
str := strsplit(text, "`n")

Loop, % str.MaxIndex() {
    send % str[A_Index]
}
Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

24 (изменено: Coffi, 2017-11-20 20:21:44)

Re: AHK: Деление строки на подстроки

belyankin12, так?

text := "«Яндекс» - российская транснациональная компания, владеющая одноимённой системой поиска в Сети, интернет-порталами и службами в нескольких странах. Наиболее заметное положение занимает на рынках России, Турции, Белоруссии и Казахстана."

Func(text, arg) {
	str := StrSplit(text, A_Space)
	rtext := ""
	ttext := ""
	
	While (str.MaxIndex() != "") {
		if (strlen(str[1]) = arg) {
			rtext .= "" . str[1] . "`n"
			str.Remove(1)
		} else if (strlen(str[1]) < arg) {
			ttext := str[1]
			str.Remove(1)
			Loop {
				var := strlen(ttext) + strlen(str[1]) + 1
				if (var = arg) {
					rtext .= "" . ttext . " " . str1 . "`n"
					str.Remove(1)
					ttext := ""
					break
				} else if (var < arg) {
					ttext .= " " . str[1] . ""
					str.Remove(1)
					continue
				} else {
					rtext .= "" . ttext . "`n"
					ttext := ""
					break
				}
			}
		} else {
			return, false
		}
	}
	return, %rtext%
}

text := func(text, 30)
str := strsplit(text, "`n")

Loop, % str.MaxIndex() {
    send % str[A_Index] "`n"
}

25

Re: AHK: Деление строки на подстроки

Я бы не советовал заносить результат функции с аргументом text в переменную text. Ну а так все верно.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

26

Re: AHK: Деление строки на подстроки

belyankin12, спасибо!