1

Тема: AHK: Подсчет стоимости по списку

Здравствуйте!
Нужен скрипт подсчета стоимости товаров. Согласно списку, скопированному в буфер обмена. Список выглядит следующим образом:

135x шпинат
30x зерно
126x цветная капуста
42x клевер
2x Козье молоко

Полагаю нужно поместить список в массив разделив каждую строку на два элемента, цифру и слово. И избавится от (х) после цифры.  Затем авто заменой или еще как  заменить слова на цифры, согласно прописанному в теле скрипта списку авто замены .
Затем перемножить первые и вторые элементы массива и сложить в общую суму!

2

Re: AHK: Подсчет стоимости по списку

В общую сумму все позиции, или каждую по отдельности?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Подсчет стоимости по списку

Все позиции.

4

Re: AHK: Подсчет стоимости по списку

Например так:

шпинат = 1
зерно = 2
цветная_капуста = 3

clipboard =
( 
135x шпинат
30x зерно
126x цветная капуста
)
StringReplace, clipboard, clipboard, %A_Space%, _, all
pos = 1
price := ""
while pos := regexmatch(clipboard, "([^\n]*)x_([^\n]*)", found, pos+StrLen(found))
   price += found1*%found2%
msgbox % price

5

Re: AHK: Подсчет стоимости по списку

Malcev спасибо, но в строке

while pos := regexmatch(clipboard, "([^\n]*)x_([^\n]*)", found, pos+StrLen(found))

выдает ошибку и я не как не пойму в чем она!

6

Re: AHK: Подсчет стоимости по списку

А версия autohotkey последняя?
http://ahkscript.org/

7

Re: AHK: Подсчет стоимости по списку

Версия 1,0,47,06

8

Re: AHK: Подсчет стоимости по списку

Скачайте актуальную версию.
Ссылка выше.

9

Re: AHK: Подсчет стоимости по списку

Скачал заработало!
Переписал скрипт под себя и столкнулся с новой проблемой.

3::
зерно = 0.5
кукуруза = 1.1
клевер = 1.34
рапс = 2.75 ;
кормовая_свёкла = 3.95 ;
ботва = 8.05 
яйца = 15
молоко = 80
подсолнух = 17.8
василёк = 18.5
морковь = 0.16 ;
огурцы = 0.52 ;
редиска = 1.02
клубника = 1.44
помидоры = 1.96 
лук = 2.28
шпинат = 3.8 
Цветная_капуста = 3.69
шерсть = 49 
мед = 70
майонез = 40
сыр = 300
Рыбка = 250
картофель = 4.38
спаржа = 12.4 
Кабачки = 3.3
Герань = 10.12
Маргаритка = 3.72
Козе_молоко = 100
Йогурт = 300
Кетчуп = 290

StringReplace, clipboard, clipboard, %A_Space%, _, all
pos = 1
price := ""
msgbox % clipboard
while pos := regexmatch(clipboard, "([^\n]*)x_([^\n]*)", found, pos+StrLen(found))
   price += found1*%found2%
msgbox % price
Return

При длине списка больше одной строки. Выскакивает ошибка ( the following variable name contains an illegal cyfracter )
указывающая на переменную второй строки списка.
Причем если при копировании того же списка, пропустив первую строку, ошибка уже указывает на третью переменную.

10

Re: AHK: Подсчет стоимости по списку

Malcev пишет:

"([^\n]*)x_([^\n]*)"

Не учтён вид переноса строк в буфере обмена, правильно так: "([^\n\r]*)x_([^\n\r]*)"

шпинат = 1
зерно = 2
цветная_капуста = 3

clipboard =
( 
135x шпинат
30x зерно
126x цветная капуста
)
StringReplace, clipboard, clipboard, %A_Space%, _, all
pos = 1
price := ""
while pos := regexmatch(clipboard, "([^\n\r]*)x_([^\n\r]*)", found, pos+StrLen(found))
   price += found1*%found2%
msgbox % price

А проще, да и надёжнее так:

шпинат = 1
зерно = 2
цветная_капуста = 3

clipboard =
( 
135x шпинат
30x зерно
126x цветная капуста
)

StringReplace, clipboard, clipboard, %A_Space%, _, all

price := 0
Loop, parse, Clipboard, `n, `r
   RegExMatch(A_LoopField, "(\d+)._(.*)", found)
   , price += found1*%found2%

msgbox % price

Здесь в паттерне "икс" заменён на точку (любой символ), чтобы не возникло путаницы между "икс" и "х" в русской раскладке.

ppvladis пишет:

Согласно списку, скопированному в буфер обмена

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

шпинат = 1
зерно = 2
цветная_капуста = 3

clipboard =
( 
135x шпинат
30x зерно
126x цветная капуста
)

price := 0
Loop, parse, Clipboard, `n, `r
{
   RegExMatch(A_LoopField, "(\d+)\S\s+(.*\S)\s*", found)
   found2 := RegExReplace(found2, "\s+", "_")
   price += found1 * %found2%
}

msgbox % price

Он, по-крайней мере, от лишних пробелов спасёт.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: Подсчет стоимости по списку

Teadrinker большое спасибо!
Попробую ваши варианты и отпишусь.
Я нашел вариант вариант без сбоев, пока тестирую.
Правда он более громоздкий.
Протестирую выложу и его, может кому пригодится.

12

Re: AHK: Подсчет стоимости по списку

Протестировал свой вариант, работает без сбоев.


3::
MouseClick, left,  619,  385, , ,D ;Верхний левый угол списка
Sleep, 100
MouseMove,  879,  610
Sleep, 100
MouseClick, left,  879,  610, , ,U ;Нижний правый угол списка
Sleep, 100
Send, ^{vk43}       ; Ctrl-C, копирование.
Sleep, 100
StringReplace, spisok, clipboard, %A_Space%, _, all ;замена пробелов подчеркиванием
StringReplace, spisok, spisok, кормовая_свёкла, 3.95, all
StringReplace, spisok, spisok, цветная_капуста, 3.69, all
StringReplace, spisok, spisok, Козье_молоко, 100, all
StringReplace, spisok, spisok, зерно, 0.5, all
StringReplace, spisok, spisok, кукуруза, 1.1, all
StringReplace, spisok, spisok, клевер, 1.34, all
StringReplace, spisok, spisok, рапс, 2.75, all
StringReplace, spisok, spisok, ботва, 8.05, all
StringReplace, spisok, spisok, яйца, 15, all
StringReplace, spisok, spisok, молоко, 80, all
StringReplace, spisok, spisok, подсолнух, 17.8, all
StringReplace, spisok, spisok, василёк, 18.5, all
StringReplace, spisok, spisok, морковь, 0.16, all
StringReplace, spisok, spisok, огурцы, 0.52, all
StringReplace, spisok, spisok, редиска, 1.02, all
StringReplace, spisok, spisok, клубника, 1.44, all
StringReplace, spisok, spisok, помидоры, 1.96, all
StringReplace, spisok, spisok, лук, 2.28, all
StringReplace, spisok, spisok, шпинат, 3.8, all
StringReplace, spisok, spisok, шерсть, 49, all
StringReplace, spisok, spisok, мёд, 70, all
StringReplace, spisok, spisok, майонез, 40, all
StringReplace, spisok, spisok, сыр, 300, all
StringReplace, spisok, spisok, рыбка, 250, all
StringReplace, spisok, spisok, картофель, 4.38, all
StringReplace, spisok, spisok, спаржа, 12.4, all
StringReplace, spisok, spisok, кабачки, 3.3, all
StringReplace, spisok, spisok, Герань, 10.12, all
StringReplace, spisok, spisok, Маргаритка, 3.72, all
StringReplace, spisok, spisok, Йогурт, 300, all
StringReplace, spisok, spisok, Кетчуп, 290, all
pos = 1
price := ""
;msgbox % spisok
while pos := regexmatch(spisok, "([0-9]*)x_([0-9]*.[0-9]*)", found, pos+StrLen(found))
{
   price += found1*found2
}
MouseClick, left,  691,  648, , , D ;
Sleep, 100
MouseMove,  814,  637
Sleep, 100
MouseClick, left,  814,  637, , , U
Sleep, 100
Send, ^{vk43}       ; Ctrl-C, копирование.
Sleep, 100
StringReplace, clipboard, clipboard, ., , all
StringReplace, clipboard, clipboard, ",", ., all
regexmatch(clipboard, "(^[0-9]*)", ceha)
otvet = net
x = 893
if (ceha > price)
{
otvet = da 
x := 619
}
MouseClick, left,  %x%,  703
;msgbox % spisok "`n" price "`n" ceha "`n" otvet " " x

Вышло несколько громоздка.
Вместо ([0-9]) пытался ставить (\d), почему то не срабатывало.
В переменную записывалось пустое значение.
Пытался найти описание функции regexmatch, не нашёл!
Если знаете где есть дайте пожалуйста ссылку.
Еще раз спасибо всем за помощь!

13

Re: AHK: Подсчет стоимости по списку

http://www.script-coding.com/AutoHotkey/RegExMatch.html

14

Re: AHK: Подсчет стоимости по списку

Плохой вариант заменять:

StringReplace, spisok, spisok, сыр, 300, all

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

15

Re: AHK: Подсчет стоимости по списку

ppvladis пишет:

Пытался найти описание функции regexmatch, не нашёл!

Регулярные выражения (RegEx) - краткий справочник

16

Re: AHK: Подсчет стоимости по списку

YMP большое спасибо!
Я там искал но почему то не увидел. И как баран пытался понять гугловский перевод английской версии.
ypppu
Регулярные выражения (RegEx) - краткий справочник
Я читал. Они не содержат описание функции regexmatch.
Malcev
Да действительно есть такая проблем.
И я с ней столкнулся.
Но её легко обойти поставив в начале составные выражения а затем одиночные.

17 (изменено: Malcev, 2014-11-25 17:06:39)

Re: AHK: Подсчет стоимости по списку

Malcev
Да действительно есть такая проблем.
И я с ней столкнулся.
Но её легко обойти поставив в начале составные выражения а затем одиночные.

А чем не устраивает вариант teadrinkerа в 10 сообщении?

18

Re: AHK: Подсчет стоимости по списку

Malcev
Обратите внимание на сообщение 11.
Выложенный мной вариант я уже начал тестировать  на тот момент.

teadrinker
Ещё раз спасибо! Протестировал предложенные варианты.
Первый и третий работают стабильно, даже при попадании лишнего в буфер обмена.
В тарой вариант выдает пустую строку.
Разбираться почему нет времени.
Тем более я не до конца с функцией regexmatch.
А я предпочитаю понимать как работает мой скрипт.