1

Тема: AHK: Деление значения на "строки", аля Fetch

Здравствуйте!
Только начал осваивать AHK, и вот одна из сложностей у меня появилась и "делении" массива данных, как это реализуется в mysql посредством fetch_row. Все это нужно для добавления к дате формата dd.MM.yyyy нескольких дней. Почитав мануалы, я понял, что простыми методами, типа ++, мне все равно не обойтись, т.к.  AHK не понимает такой формат даты.

Поменять в системе формат даты не предлагать, не подходит.

Думаю нужно сделать так -
1) Берем дату формата dd.MM.yyyy
2) Разбиваем ее на 3 переменных dd MM yyyy при этом удаляя точки
3) Выставляем в последовательности yyyyMMdd
4) Добавляем дни (+= %кол-во дней%, days)
5) Выставляем последовательность в первоначальное положение, добавляя точки и убирая часы, минуты и секунды
6) Получаем dd+5.MM.yyyy

Помогите пожалуйста с синтаксисом. Заранее спасибо.

2 (изменено: serzh82saratov, 2015-09-07 21:17:26)

Re: AHK: Деление значения на "строки", аля Fetch


adddays := 3
indate = 29.08.2015 
outdate := (_:=StrSplit(indate,"."))[3] _[2] _[1] 
outdate += adddays, days
FormatTime, outdate, %outdate%, dd.MM.yyyy
MsgBox % outdate
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

3

Re: AHK: Деление значения на "строки", аля Fetch

Спасибо за оперативность! А подскажите, как мне добавить проверку этих 3-х переменных на наличие именно цифр? Ну, допустим, чтобы мне в день, месяц или год не втулило буквы или спецсимволы? (Просто дата сканируется и распознается прогой Kleptomania)

4

Re: AHK: Деление значения на "строки", аля Fetch

indate = 29.01.2015
MsgBox % (indate ~= "^\d{2}\.\d{2}\.\d{4}$" ? "" : "не") "правильно"
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

5 (изменено: Seva, 2015-09-07 21:53:03)

Re: AHK: Деление значения на "строки", аля Fetch

serzh82saratov пишет:
indate = 29.01.2015
MsgBox % (indate ~= "^\d{2}\.\d{2}\.\d{4}$" ? "" : "не") "правильно"

А чтобы после проверки (если правильно), как мне вставить эту дату



Send, % indate

А то, что то я вообще запутался с ~= "^

6 (изменено: serzh82saratov, 2015-09-07 21:54:20)

Re: AHK: Деление значения на "строки", аля Fetch

if (indate ~= "^\d{2}\.\d{2}\.\d{4}$")
    Send, % indate 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

7

Re: AHK: Деление значения на "строки", аля Fetch

Можно проверить на соответствие типа time. (Один из ... вариантов).

adddays := 3
indate = 29.08.2o15 
outdate := (_:=StrSplit(indate,"."))[3] _[2] _[1]
if outdate is not time
   MsgBox Что-то пошло не так
else
{
   outdate += adddays, days
   FormatTime, outdate, %outdate%, dd.MM.yyyy
   MsgBox % outdate
}

8

Re: AHK: Деление значения на "строки", аля Fetch

Так, с "якорями" разобрался, там начало, там конец.. А дальше темный лес((

9

Re: AHK: Деление значения на "строки", аля Fetch

\d{2}\.

Цифры только две, дальше точка. \ экранирует спец символы. RegEx он и в AutoHotkey RegEx.

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

10

Re: AHK: Деление значения на "строки", аля Fetch

Спасибо всем, разобрался.

11 (изменено: Seva, 2015-09-09 15:12:26)

Re: AHK: Деление значения на "строки", аля Fetch

Есть еще один небольшой вопрос: Программа Kleptomania после нескольких распознаваний текста загоняет в буфер всякую рекламу типа - *** Did your best friend try the Kleptomania? *** или *** Kleptomania FAQ is at http://www.structurise.com/kleptomania/faq.htm *** (методом научного тыка выяснил, что реклама добавляется или ДО или ПОСЛЕ данных, скопированных в буфер обмена)
Можно ли как нибудь делать проверку на наличие ненужных символов (допустим ***) в буфере обмена и при наличии их обрезал содержимое буфера до даты, которая мне собственно и нужна?

12

Re: AHK: Деление значения на "строки", аля Fetch

Да, используя IfInString/RegExMatch/RegExReplace.

13 (изменено: Seva, 2015-09-09 17:44:28)

Re: AHK: Деление значения на "строки", аля Fetch

Drugoy пишет:

Да, используя IfInString/RegExMatch/RegExReplace.

Спасибо, а на примере покажете? А то я "чайник"
*** Did your best friend try the Kleptomania? *** 21.07.2014
или
21.07.2014 *** Did your best friend try the Kleptomania? ***

Заранее спасибо.

14

Re: AHK: Деление значения на "строки", аля Fetch

var := "21.07.2014"
;var := "21.07.2014 *** Did your best friend try the Kleptomania? ***"
;var := "*** Did your best friend try the Kleptomania? *** 21.07.2014"
msgbox % """" RegexReplace(var," ?\*\*\*.+?\*\*\* ?") """"

15

Re: AHK: Деление значения на "строки", аля Fetch

Так время не проверить:

var := "2й1.0ё7.20ы14 *** Did your best friend try the Kleptomania? ***" 
msgbox % """" RegexReplace(var," ?\*\*\*.+?\*\*\* ?") """"

Может как то так:

adddays := 3
indate := "*** Did your best friend try the Kleptomania? *** 21.07.2014 *** Did your best friend try the Kleptomania? ***"

If !RegExMatch(indate, "(?P<me>\d{2}\.\d{2}\.\d{4})", ti) {
    MsgBox В переменной "indate" не содержится подстрока со временем вида dd.MM.yyyy
    Return
}
outdate := (_:=StrSplit(time,"."))[3] _[2] _[1] 
outdate += adddays, days
FormatTime, outdate, %outdate%, dd.MM.yyyy
MsgBox % outdate
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

16 (изменено: Malcev, 2015-09-09 19:35:23)

Re: AHK: Деление значения на "строки", аля Fetch

Думаю, если хочется удостовериться в 100% правильности даты, то надо еще условий добавить:

adddays := 3
indate := "*** Did your best friend try the Kleptomania? *** 121.25.2014e *** Did your best friend try the Kleptomania? ***"

If !RegExMatch(indate, "(?P<me>\d{2}\.\d{2}\.\d{4})", ti) {
    MsgBox В переменной "indate" не содержится подстрока со временем вида dd.MM.yyyy
    Return
}
outdate := (_:=StrSplit(time,"."))[3] _[2] _[1] 
outdate += adddays, days
FormatTime, outdate, %outdate%, dd.MM.yyyy
MsgBox % outdate

17

Re: AHK: Деление значения на "строки", аля Fetch

Да какие тут гарантии, если речь про распознаватель текста, мало ли что он ещё по краям понавесит.

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

18

Re: AHK: Деление значения на "строки", аля Fetch

serzh82saratov пишет:

Да какие тут гарантии, если речь про распознаватель текста, мало ли что он ещё по краям понавесит.

Иногда "вешает" Enter

19 (изменено: Seva, 2015-09-09 19:43:02)

Re: AHK: Деление значения на "строки", аля Fetch

А можно ли удалить из буфера ВСЕ, кроме \d{2}\.\d{2}\.\d{4}   ??

20

Re: AHK: Деление значения на "строки", аля Fetch

Вот сейчас очень сильно удивили, а предложенный мною код не катит?

adddays := 3
indate := "*** Did your best friend try the Kleptomania? *** 21.07.2014 *** Did your best friend try the Kleptomania? ***"

If !RegExMatch(indate, "(?P<me>\d{2}\.\d{2}\.\d{4})", ti) {
    MsgBox В переменной "indate" не содержится подстрока со временем вида dd.MM.yyyy
    Return
}
MsgBox % time
outdate := (_:=StrSplit(time,"."))[3] _[2] _[1] 
outdate += adddays, days
FormatTime, outdate, %outdate%, dd.MM.yyyy
MsgBox % outdate
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

21

Re: AHK: Деление значения на "строки", аля Fetch

serzh82saratov пишет:

Вот сейчас очень сильно удивили, а предложенный мною код не катит?

Спасибо, катит Просто пока разбирался с синтаксисом... Не успел попробовать Еще раз спасибо!

22

Re: AHK: Деление значения на "строки", аля Fetch

А подскажите еще один маленький нюанс, каким образом сделать проверку outdate - если попадает на воскресенье то + 1 день?

23

Re: AHK: Деление значения на "строки", аля Fetch

adddays := 3
indate := "*** Did your best friend try the Kleptomania? *** 08.10.2015 *** Did your best friend try the Kleptomania? ***"

If !RegExMatch(indate, "(?P<me>\d{2}\.\d{2}\.\d{4})", ti) {
    MsgBox В переменной "indate" не содержится подстрока со временем вида dd.MM.yyyy
    Return
}
; MsgBox % time
outdate := (_:=StrSplit(time,"."))[3] _[2] _[1]
outdate += adddays, days
FormatTime, DayOfWeek, %outdate%, ddd
MsgBox % DayOfWeek
outdate += DayOfWeek="Вс", days
FormatTime, outdate, %outdate%, dd.MM.yyyy
MsgBox % outdate

Скорее всего, отображение дня недели (Вс, Пн и т.д.) зависит от установленного языка системы, то есть в общем случае нужно еще добавить проверки.