Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Переформатировать текстовую строку в понятное для AutoIT выражение

Ответить
Настройки темы
[решено] Переформатировать текстовую строку в понятное для AutoIT выражение

Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Здравствуйте форумчане.Нужна помощь.
Есть текстовая строка
Код: Выделить весь код
when haveoverpair and (hand=99 or hand=44) and totalinvested > 120% stacksize raisemax force
Нужно ее переформатировать в надлежащий вид c двумя переменными
Код: Выделить весь код
$when = $haveoverpair and ($hand=99 or $hand=44) and ($totalinvested > $stacksize /100 * 120)
$force = 'raisemax'
Первая привязка - это процент,а вторая слово forse.У меня проблема выражение totalinvested > 120% stacksize переделать в ($totalinvested > $stacksize /100 * 120)
и из участка строки raisemax force переформатировать в $force = 'raisemax'
Может у вас будут какие-то свежие идеи.Смысл в следующем .Берем строку из текстового файла,ищем строку при решении которая выдает результат True и тогда мы выполняем действие стоящее перед словом force.Строки обсалютно разного содержания.Но в начале строки слово when обязательно.
Вот не большой участок текстового файла

when not BotRaisedBeforeFlop and bets=1 and raises>0
when (havestraightflush or havequads ) raisemax force
when tripsonboard and NutFullHouseOrFourOfAKind=0 fold force
when tripsonboard and NutFullHouseOrFourOfAKind>3 fold force
when (havefullhouse or haveflush or havestraight or haveset) raisemax force
when havetrips and HaveBestKicker raisemax force
when haveoverpair and (hand=AA or hand=KK) raisemax force
when (haveflushdraw or havestraightdraw) and overcards>0 raisemax force

Отправлено: 16:51, 15-06-2011

 

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Так пойдёт:

Код: Выделить весь код
Dim $aLines[9] = _
    [ _
        'when haveoverpair and (hand=99 or hand=44) and totalinvested > 120% stacksize raisemax force', _
        'when not BotRaisedBeforeFlop and bets=1 and raises>0', _
        'when (havestraightflush or havequads ) raisemax force', _
        'when tripsonboard and NutFullHouseOrFourOfAKind=0 fold force', _
        'when tripsonboard and NutFullHouseOrFourOfAKind>3 fold force', _
        'when (havefullhouse or haveflush or havestraight or haveset) raisemax force', _
        'when havetrips and HaveBestKicker raisemax force', _
        'when haveoverpair and (hand=AA or hand=KK) raisemax force', _
        'when (haveflushdraw or havestraightdraw) and overcards>0 raisemax force' _
    ]

For $sLine In $aLines
    ConsoleWrite("===================================" & @LF & _AutoItParseLine($sLine) & @LF)
Next

Func _AutoItParseLine($sLine)
    Local $sOperators, $aLine, $aVars, $sRet

    $sOperators = 'and|or|not'

    ;Разделяем строку на две части. 1-ая это вся строка без двух последних переменных (на конце), а 2-ая это и есть последние две переменные (см. далее)
    $aLine = StringRegExp($sLine, '(?i)(.*?)(?: ([a-z_]+ [a-z_]+))?$', 3)

    ;Получаем все переменные в массив (! переменные не могут содержать числа)
    $aVars = StringRegExp($aLine[0], '(?i)([a-z_]+)', 3)

    ;Парсируем проценты (120%)
    $aLine[0] = StringRegExpReplace($aLine[0], '(\d+)% ([a-z_]+)', '(\2 / 100 * \1)')

    ;Парсируем первую переменную, присваиваем ей всё остальное выражение ("$when = ")
    $aLine[0] = StringRegExpReplace($aLine[0], '(?i)^(when )', '$\1= ')

    ;Оперделяем строку возврата (эта строка уже обрезана, и не содержит двух последних переменных)
    $sRet = $aLine[0]

    ;Если строка содержит на конце две переменные...
    If $aLine[1] <> '' Then
        ;Добавляем эти переменные в перевёрнутом порядке на новую строку
        $sRet &= @CRLF & StringRegExpReplace($aLine[1], '([a-z_]+) ([a-z_]+)$', "$\2 = '\1'")
    EndIf

    ;Проходимся по массиву переменных...
    For $sVar In $aVars
        ;Если это не оператор...
        If Not StringRegExp($sVar, '(?i)^(' & $sOperators & ')$') Then
            ;Добавляем к имени переменной символ $
            $sRet = StringRegExpReplace($sRet, '\b(?<!\$)' & $sVar & '\b', '$' & $sVar, 1)
        EndIf
    Next

    ;Возвращаем полученную строку
    Return $sRet
EndFunc
?

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Последний раз редактировалось Creat0R, 16-06-2011 в 10:02. Причина: Поправил код, + добавил комментарий

Это сообщение посчитали полезным следующие участники:

Отправлено: 01:02, 16-06-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо за ответ и новые идеи!!!У меня почему-то код ничего не выводит.Разбираюсь.

Отправлено: 07:03, 16-06-2011 | #3


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата PCLAlex:
У меня почему-то код ничего не выводит »
Он выводит данные в консоль SciTE.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 09:51, 16-06-2011 | #4


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Сегодня весь день методом тыка все истыкал.Получается лажа.Посмотрите что смастерил.
Код: Выделить весь код
$totalinvested = 150  
$stacksize = 300  
$haveoverpair = True  
$hand = "AK"   

$sString = 'when haveoverpair and (hand=AK or hand=44) and totalinvested>120% stacksize raisemax force'  
$aString = StringRegExp($sString,'(^\w+?\b)(.*)$',3);отделяем when  
$aFunc = StringRegExp($aString[1], '(?i)(.*?)(?: ([a-z_]+ [a-z_]+))?$', 3);разделяем forse + действие от основной строки  
$Forse =  StringRegExpReplace($aFunc[1], '(\w+) ?(forse)', '"\1"');назначаем  действие force (должно быть слово "raisemax"  
MsgBox(4096, Forse , $Forse )  
$aFunc[0] = StringRegExpReplace($aFunc[0], '([=<>()%])', ' \1 ');добовляем пробелы к символам "=<>()%"  
MsgBox(4096, 'добовляем пробелы', $aFunc[0] )  
$aFunc[0] = StringRegExpReplace($aFunc[0], '(\w+)', '$\1');добовляем знак "$" ко всем словам  
MsgBox(4096,' добовляем знак "$" ко всем словам', $aFunc[0] )  
$aFunc[0] = StringRegExpReplace($aFunc[0], '(?i)\$(and|or|not)', '\1'); убираем знак "$" перд словами and|or|not  
MsgBox(4096, 'убираем знак "$" перд словами and|or|not' , $aFunc[0] )  
$aFunc[0] = StringRegExpReplace($aFunc[0], '(?i)\ = \$?([a-z]+)', ' = \1'); убираем знак "$" у строковых переменных "hand"  
MsgBox(4096,'убираем знак "$" у строковых переменных', $aFunc[0] )  
$aFunc[0] = StringRegExpReplace($aFunc[0], '(?i)($hand = )(\w+)', '$hand = "\2"'); hand должо содержать строковую переменную " " (АК должно быть в ковычках)  MsgBox(4096,'АК должно быть в ковычках', $aFunc[0] )  
$aFunc[0] = StringRegExpReplace($aFunc[0], '(\w+[a-z]) ?([=<>]) ?(\d+) ?% (\w+[a-z_]+)', ' ( \1 \2 \4 / 100 * \3 )'); процент переводим в надлежащий вид  
MsgBox(4096,  'процент переводим в надлежащий вид', $aFunc[0] )  
$when = Execute($aFunc[0])  
MsgBox(0, 'Создали переменную '$Forse, $when)
Укажите на ошибки!

Цитата Creat0R:
Он выводит данные в консоль SciTE. »
Поясни пожалуйста.

Отправлено: 13:53, 16-06-2011 | #5


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата PCLAlex:
Поясни пожалуйста. »
ConsoleWrite пишет в Std-поток. SciTE умеет выводить этот поток у себя в окне (внизу в выдвигающейся панели).

Замени
Код: Выделить весь код
ConsoleWrite(
на
Код: Выделить весь код
MsgBox(64, '',
и не мучайся.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 15:27, 16-06-2011 | #6


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Не много отвлекся от проблемы и решение почти появилось!!!
Код: Выделить весь код
$totalinvested = 600  
$stacksize = 300    
$haveoverpair = True    
$hand = "AK"       

$sString = 'when haveoverpair and (hand=AK or hand=44) and totalinvested>120% stacksize raisemax force'    
$aString = StringRegExp($sString,'(^\w+?\b)(.*)$',3);отделяем when    
$aFunc = StringRegExp($aString[1], '(?i)(.*?)(?: ([a-z_]+ [a-z_]+))?$', 3);разделяем forse + действие от основной строки    
$Forse =  StringRegExpReplace($aFunc[1], '(\w+)(\h+)(force)', '"\1"');назначаем  действие force (должно быть слово "raisemax"    
$aFunc[0] = StringRegExpReplace($aFunc[0], '(\h*)([=<>()%])(\h*)', ' \2 ');добовляем пробелы к символам "=<>()%"    
$aFunc[0] = StringRegExpReplace($aFunc[0], '([a-z_]+)', '$\1');добовляем знак "$" ко всем словам     
$aFunc[0] = StringRegExpReplace($aFunc[0], '(?i)\$(and|or|not)', '\1'); убираем знак "$" перд словами and|or|not    
$aFunc[0] = StringRegExpReplace($aFunc[0], '(?i)\ = \$?([a-z0-9]+\h+)', ' = \1'); убираем знак "$" у строковых переменных "hand"     
$aFunc[0] = StringRegExpReplace($aFunc[0], '(?i)\$(hand =) ?([a-z0-9]+)', '$hand = "\2"'); hand должо содержать строковую переменную " " (АК должно быть в ковычках)  
$aFunc[0] = StringRegExpReplace($aFunc[0], '\$([a-z_]+)\h+([=<>])\h+(\d+)\h+% \$(\w+[a-z_]+)', ' ( \1 \2 \4 / 100 * \3 )'); процент переводим в надлежащий вид  
$when = Execute($aFunc[0])    
If $when = False Then   	
MsgBox(0, 'Переменная $when ='& $Forse,"False")  
EndIf 
If $when = True Then   	
MsgBox(0, 'Переменная $when ='& $Forse,"True") 
EndIf
ошибка осталась скорее всего одна но найти я ее не могу.По идее результат вычисления должен быть TRUE а в этом примере он FALSE ????
Creat0R огромное тебе спасибо!!!Я сегодня с твоей подачи написал свое первое регулярное выражение!!!

У меня почему-то приходится править код после вставки из буфера.Это глюк только у меня??

Отправлено: 16:13, 16-06-2011 | #7


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Вложения
Тип файла: zip _AutoItParseLine.zip
(1.1 Kb, 4 просмотров)

Цитата PCLAlex:
По идее результат вычисления должен быть TRUE а в этом примере он FALSE ???? »
Ну ты бы хоть проверял полученную строку:
Код: Выделить весь код
MsgBox(0, '', $aFunc[0])
сразу видно что не все переменные преобразовываются.

Прикрепил свой вариант (с учётом помещения значений переменных в кавычки).

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 18:12, 16-06-2011 | #8


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо за столь исчерпывающие ответы!Тема решена!Я думаю здесь многие как и я найдут для себя много полезного!Встретимся на других темах.Тема закрыта.

Отправлено: 06:58, 17-06-2011 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Переформатировать текстовую строку в понятное для AutoIT выражение

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Как преобразовать текстовую формулу в числовой результат malev AutoIt 2 18-09-2009 11:09
[решено] Нужен скрипт для autoit для раскопирования файла irk72ag Автоматическая установка приложений 3 19-06-2009 15:27
Регулярное выражение для проверки денежной суммы BuilderMan Вебмастеру 9 23-08-2006 11:24
как уменьшить текстовую страницу? OST Вебмастеру 2 17-01-2006 15:46
переформатировать html serg2002 Вебмастеру 5 16-09-2002 21:27




 
Переход