1 (изменено: ОсиповаТатьяна, 2019-04-20 11:42:16)

Тема: AHK: Нахождение последнего конкретного слова в txt

Добрый день.

У меня есть txt файл.
В нем периодически встречаются слова "утро перпол7", "день вторпол16" и "вечер вторпол21".

Посоветуйте, как скриптом AHK - проанализировать "1.txt" на последнее введенное слово данного  и скопировать его в 2.txt ?

То есть если последнее слово, которое я введу в 1.txt - будет слово "день вторпол16" - то после сохранения 1.txt запуска ahk-скрипта  в файл 2.txt - впишется "день вторпол16" (заменив предыдущее содержимое файла).

Post's attachments

Файлы 1.txt и 2.txt.zip 406 b, 4 downloads since 2019-04-20 

You don't have the permssions to download the attachments of this post.

2

Re: AHK: Нахождение последнего конкретного слова в txt

"день вторпол16" - это не слово, а строка.
Как я понял, имеется несколько переменных, либо массив, в котором хранятся строки. Нужно проверить, совпадает ли концовка длинного текста хотя бы с одной строкой из массива.

3

Re: AHK: Нахождение последнего конкретного слова в txt

Если цифры в конце строки обозначают часы, то, зная, что это время соответствует какому-то состоянию, например "день вторпол16", можно искать именно "слово" — "вторпол16".

Вначале, проверяемый файл нужно прочитать и сохранить его содержимое в переменную: FileRead. Далее, узнать, есть ли в полученном содержимом искомое: InStr(), результатом которой будет позиция найденной строки, если она будет обнаружена. И наконец, нужно узнать положение найденной подстроки в строке, чтобы выяснить, находится ли она в конце. Для этого нужно получить длину исследуемой и искомой строк: StrLen() и прибавить к позиции найденной строки её длину и если полученная сумма будет эквивалентна длине содержимого файла, то искомая строка действительно в самом конце.

4

Re: AHK: Нахождение последнего конкретного слова в txt

KusochekDobra пишет:

можно искать именно "слово" — "вторпол16".

Да наверное можно и так.

5

Re: AHK: Нахождение последнего конкретного слова в txt

А как это сделать скриптом ?

6

Re: AHK: Нахождение последнего конкретного слова в txt

Полное руководство к действию, со всеми ссылками, в третьем сообщении.

Скоро четыре месяца, как Вы зарегистрированы на этом форуме и, полагаю, Ваше знакомство с AHK было ещё раньше. За это время можно без труда освоить базовый уровень, на котором то малое количество задач, что Вы решали до сих пор. Как видно из третьего сообщения, нынешняя задача так же проста, раз её полное логическое описание легко укладывается в пяток строк.

В этом разделе форума можно запросто получить дельный совет, или конструктивную критику. Просьбы написать для Вас готовое решение публикуются в платном разделе. Если считаете свою задачу непреодолимой, но важной, это будет подходящим местом, чтобы не ходить вокруг да около. Но если видите в своей перспективе дальнейшее использование сего инструмента, то пора открыть справку и почитать.

Пробуйте. Дорогу осилит идущий.

7 (изменено: ОсиповаТатьяна, 2019-04-19 20:20:47)

Re: AHK: Нахождение последнего конкретного слова в txt

KusochekDobra, понимаете - в этом языке - какая-то очень неудобная справка.
Вот поэтому и приходится писать на форум чтобы подсказали.
В автоите например справочными материалами пользоваться очень удобно.

Значит.
1.Вначале, проверяемый файл нужно прочитать и сохранить его содержимое в переменную: FileRead.
2.Узнать, есть ли в полученном содержимом искомое: InStr(), результатом которой будет позиция найденной строки
3.Получить длину исследуемой и искомой строк: StrLen() и прибавить к позиции найденной строки её длину и если полученная сумма будет эквивалентна длине содержимого файла, то искомая строка действительно в самом конце.

А все-таки непонятно - нужно всего одно последнее  слово скопировать из гущи текста.
Где команда копирования этого слова ?

И еще - в тексте искомых слов - будет полным полно.
Вот вы пишите - узнать есть ли в полученном содержимом искомое.  А что такое искомое - здесь, в этой конструкции ?
Это вы имеете ввиду одно слово или несколько слов ?

8

Re: AHK: Нахождение последнего конкретного слова в txt

Действительно, прошу прощения, развыпендривался грамотностью, а сам больше запутал. Попробуйте так:
- Прочитать файл в переменную, чтобы изучить её содержимое с конца.
- В строке "вторпол16" = 9 символов, значит, нужно получить последние 9 символов из полученных данных.
- SubStr() — согласно справке, вторым аргументом принимает значение стартовой позиции в исследуемой строке и если это значение меньше единицы, то извлекает символы с конца. В Вашем случае, следует передать -8, так как 0 возвращает последний символ, а -1, два последних.
- Полученную подстроку сравниваете с "вторпол16" и если сравнение вернёт истину, перезаписываете второй файл нужным значением.
- Для этого файл следует удалить FileDelete и совершить в одноимённый файл запись FileAppend. В этом случае файл будет создан автоматически.

Именно "копировать", думаю, излишне, раз значение целиком известно.

"Неудобно" всё, когда в самом начале пути. Человек с четверенек встаёт с немалым трудом, с тем, чтобы потом на двух ногах удовлетворять своё любопытство. Но это вначале, когда иного и быть не может, а когда всю жизнь не слышал слов на другом языке, сознание спотыкается о неизвестное и на сцене появляется "лень". Она утверждает, что человек говорящий "чужие" слова — кривляется, коверкает речь и в принципе не может быть умным, ведь вся известная доселе мудрость была впитана из слов знакомых слуху! Что все принципы уже и так изведаны и не нужно пытаться понимать его, чтобы потом узнать от него то, что тебе и так известно... Лень, коварна! Она закрывает перед нами возможности, о существовании которых возможно никогда не узнать, только потому, что нам "кто-то", очень доходчиво объясняет, что именно это называется — "неудобно", но никак не "лень".

И конечно же, пребывать в уверенности, что всё именно так — Ваше полное право.

9

Re: AHK: Нахождение последнего конкретного слова в txt

KusochekDobra, все равно непонятно.

Вот вы пишите - В строке "вторпол16" = 9 символов, значит, нужно получить последние 9 символов из полученных данных.
Но ключевых слов - всего 24.
И например в слове "перпол7" - 7 символов, а в слове "вторпол5" - 8 символов.

Почему именно 9 символов?

Дальше вы пишите, что "SubStr() — извлекает символы с конца."
Но ведь в моем файле 1.txt - слово "вторпол16" - оно не самое последнее во всем тексте. Там и после него - идут какие-то символы.
И если извлекать последние 8 символов с конца - то получится "ry756567"

Я имела ввиду, что "вторпол16" - это последнее из ключевых слов встречающееся в документа, а не последнее слово с конца.

10 (изменено: KusochekDobra, 2019-04-20 14:55:37)

Re: AHK: Нахождение последнего конкретного слова в txt

Мне пока не доступно чтение мыслей.
Опираться на содержимое первого сообщения уже не представляется возможным, так как Вы его недавно редактировали, исказив тем самым начальный посыл, но даже сейчас в нём идёт речь о примере, предпринимающим некоторые действия в конкретной ситуации. Следовательно, все 24 случая будут делать то же самое, с разницей лишь в записываемом значении во второй файл.

ОсиповаТатьяна пишет:

Почему именно 9 символов?

Девять символов = касаются конкретно текущей ситуации примера. Количество символов для каждого отдельного случая можно получить при помощи StrLen().

ОсиповаТатьяна пишет:

Дальше вы пишите, что "SubStr() — извлекает символы с конца."
Но ведь в моем файле 1.txt - слово "вторпол16" - оно не самое последнее во всем тексте. Там и после него - идут какие-то символы.
И если извлекать последние 8 символов с конца - то получится "ry756567"

Я имела ввиду, что "вторпол16" - это последнее из ключевых слов встречающееся в документа, а не последнее слово с конца.

Первое сообщение описывает ситуацию иначе:

ОсиповаТатьяна пишет:

То есть если последнее слово, которое я введу в 1.txt - будет слово "день вторпол16" - то после сохранения 1.txt запуска ahk-скрипта  в файл 2.txt - впишется "день вторпол16" (заменив предыдущее содержимое файла).

=========================
Раз ключевых значений 24, полагаю, что это по количеству часов в сутках, тогда из файла, нужно получать не строку, а число, следующее последним в группе символов без пробела, в строке, начинающейся с "утро", "день", "вечер", или "ночь".
Число будет точнее отождествляться с тем, что Вам нужно, если, конечно, "перпол" и "вторпол" не обозначают соответственно первую, или вторую половину часа, число которого искомое. Тогда:


FileRead, fileContent, 1.txt
lastState := RegExReplace(fileContent, ".*(?<=утро|день|вечер|ночь) ([а-я\d]+)", "$1")
MsgBox % lastState

Теперь "lastState" будет всегда содержать последнее записанное в первый файл состояние, которое Вы можете записывать описанным ранее способом во второй. Или, так:


FileRead, fileContent, 1.txt
RegExMatch(fileContent, ".*(?<=утро|день|вечер|ночь) ([а-я]+)(\d+)", m)
MsgBox % Format("{} половина {} часа", m1 == "перпол" ? "Первая" : "Вторая", m2)

11 (изменено: ОсиповаТатьяна, 2019-04-20 15:24:06)

Re: AHK: Нахождение последнего конкретного слова в txt

KusochekDobra пишет:

так как Вы его недавно редактировали, исказив тем самым начальный посыл

Нет, я не редактировала сообщение, а добавила собственно - сами файлы 1.txt и 2.txt - которые почему-то раньше не прикрепились.

KusochekDobra пишет:

Раз ключевых значений 24, полагаю, что это по количеству часов в сутках

Да все верно - это так время записывается.
Перпол и вторпол - это не половина часа, а первая или вторая половина дня, ночи, вечера, утра.
"День вторпол16" - означает - вторая половина дня 16.00

KusochekDobra пишет:

нужно получать не строку, а число, следующее последним в группе символов без пробела

Число следующее в группе символов без пробела - это не критерий поиска.

Потому что по этой схеме запись "tdstkfjws14," - будет считаться ключевым словом - так как в нем группа символов без пробела заканчивается числом.
Хотя ключевые слова совсем другие - их всего 24.

KusochekDobra пишет:

в строке, начинающейся с "утро", "день", "вечер", или "ночь".

Дело в том, что в тексте 1.txt может быть просто написано слово "утро " без дальнейших составляющих. В этом случае - это слово не подходит под критерий поиска. Поскольку должно быть или "утро перпол" или "утро вторпол".

12 (изменено: serzh82saratov, 2019-04-20 16:14:20)

Re: AHK: Нахождение последнего конкретного слова в txt

Haystack = 
(
ighiu45h
hy
jhy6


утро перпол7
yu56yu3453 
 
rtghty
65456 546456 4546

56

6


3
5
346

7567567j57u657ug67u76ujhg день вторпол16, 345fgh 6ry756567
)

If RegExMatch(Haystack, "si).*(?<State>(утро|день|вечер|ночь) (пер|втор)пол\d+)", last)
	MsgBox % lastState
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

13

Re: AHK: Нахождение последнего конкретного слова в txt

KusochekDobra, полный список ключевых слов такой:
ночь перпол0
ночь перпол1
ночь перпол2
ночь вторпол3
ночь вторпол4
ночь вторпол5
утро перпол6
утро перпол7
утро перпол8
утро вторпол9
утро вторпол10
утро вторпол11
день перпол12
день перпол13
день перпол14
день вторпол15
день вторпол16
день вторпол17
вечер перпол18
вечер перпол19
вечер перпол20
вечер вторпол21
вечер вторпол22
вечер вторпол23

То есть числа здесь - это как бы просто составляющая ключевого слова, а не цифра которую надо какой-то функцией распознавать.

14

Re: AHK: Нахождение последнего конкретного слова в txt

serzh82saratov, возможно опция s будет нужна.
ОсиповаТатьяна, если вам пока сложны регулярные выражения, то используйте instr.
В справке же всё написано:

Haystack = 
(
утро перпол7
день вторпол16
утро перпол7
день вторпол16
)

msgbox % InStr(Haystack, "утро перпол7",,0)
msgbox % InStr(Haystack, "день вторпол16",,0)

15

Re: AHK: Нахождение последнего конкретного слова в txt

Malcev пишет:

serzh82saratov, возможно опция s будет нужна

Зачем?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

16

Re: AHK: Нахождение последнего конкретного слова в txt

Haystack = 
(
утро перпол7
`r`n
день вторпол16
)

If RegExMatch(Haystack, "i).*(?<State>(утро|день|вечер|ночь) (пер|втор)пол\d+)", last)
	MsgBox % lastState

Я вообще взял за правило всегда ее использовать.

17

Re: AHK: Нахождение последнего конкретного слова в txt

Согласен, поправил №12.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

18

Re: AHK: Нахождение последнего конкретного слова в txt

Ну и еще неизвестно, могут ли в тексте попадаться и следовательно давать ложные срабатывания словосочетания, типа: "ночь перпол15".
Возможно, правильней все 24 словосочетания просто в регулярке перечислить.

19

Re: AHK: Нахождение последнего конкретного слова в txt

Malcev пишет:

просто в регулярке перечислить.

А как их в регулярке перечислить ?
Хотя бы два слова.

20

Re: AHK: Нахождение последнего конкретного слова в txt

Haystack = 
(
утро перпол7
`r`n
день вторпол16
)

needles = 
( Join|
ночь перпол0
ночь перпол1
ночь перпол2
ночь вторпол3
ночь вторпол4
ночь вторпол5
утро перпол6
утро перпол7
утро перпол8
утро вторпол9
утро вторпол10
утро вторпол11
день перпол12
день перпол13
день перпол14
день вторпол15
день вторпол16
день вторпол17
вечер перпол18
вечер перпол19
вечер перпол20
вечер вторпол21
вечер вторпол22
вечер вторпол23
)

If RegExMatch(Haystack, "si).*(?<State>(" needles "))", last)
	MsgBox % lastState
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

21

Re: AHK: Нахождение последнего конкретного слова в txt

serzh82saratov, спасибо - теперь все понятно стало.
Всем спасибо за ответы.

22

Re: AHK: Нахождение последнего конкретного слова в txt

ОсиповаТатьяна пишет:

понимаете - в этом языке - какая-то очень неудобная справка.
Вот поэтому и приходится писать на форум чтобы подсказали.
В автоите например справочными материалами пользоваться очень удобно.

А чем в автоите справка удобнее? И зачем тогда делать на AutoHotkey?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

23

Re: AHK: Нахождение последнего конкретного слова в txt

serzh82saratov пишет:

А чем в автоите справка удобнее?

Больше примеров приведено.
На каждую функцию (в справке) прицеплена гиперссылка с примером.

24

Re: AHK: Нахождение последнего конкретного слова в txt

Как бы на каждую команду в переводе есть примеры или гиперссылки на примеры применения в описании других команд. Другое дело, что не все команды переведены, но их качество трудно поставить под сомнение (особенно радует наличие примечаний от переводчика).

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

25

Re: AHK: Нахождение последнего конкретного слова в txt

Я всё собирался по RegEx выложить, эх не успел.

26

Re: AHK: Нахождение последнего конкретного слова в txt

ОсиповаТатьяна
Вы про русскую справку?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

27

Re: AHK: Нахождение последнего конкретного слова в txt

serzh82saratov, ну там как бы и русская и английская справки хорошо работают.
https://autoit-script.ru/autoit3_docs/menu/total.htm

Вот вы щелкаете например по ссылке какой-нибудь функции - и тут же перемещаетесь в описание этой конкретной функции, с обязательным примером ее работы в коде.
UDF там тоже некоторые расписаны (хотя и далеко не все).