Войти

Показать полную графическую версию : [решено] Переформатировать текстовую строку в понятное для AutoIT выражение


PCLAlex
15-06-2011, 16:51
Здравствуйте форумчане.Нужна помощь.
Есть текстовая строка
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

Creat0R
16-06-2011, 01:02
Так пойдёт:

Dim (http://www.autoitscript.com/autoit3/docs/keywords.htm#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 (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $sLine In (http://www.autoitscript.com/autoit3/docs/keywords.htm#In) $aLines
ConsoleWrite (http://www.autoitscript.com/autoit3/docs/functions/ConsoleWrite.htm)("===================================" & @LF (http://www.autoitscript.com/autoit3/docs/macros.htm#@lf) & _AutoItParseLine($sLine) & @LF (http://www.autoitscript.com/autoit3/docs/macros.htm#@lf))
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _AutoItParseLine($sLine)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $sOperators, $aLine, $aVars, $sRet

$sOperators = 'and|or|not'

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

;Получаем все переменные в массив (! переменные не могут содержать числа)
$aVars = StringRegExp (http://www.autoitscript.com/autoit3/docs/functions/StringRegExp.htm)($aLine[0], '(?i)([a-z_]+)', 3)

;Парсируем проценты (120%)
$aLine[0] = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($aLine[0], '(\d+)% ([a-z_]+)', '(\2 / 100 * \1)')

;Парсируем первую переменную, присваиваем ей всё остальное выражение ("$when = ")
$aLine[0] = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($aLine[0], '(?i)^(when )', '$\1= ')

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

;Если строка содержит на конце две переменные...
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $aLine[1] <> '' Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
;Добавляем эти переменные в перевёрнутом порядке на новую строку
$sRet &= @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@crlf) & StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($aLine[1], '([a-z_]+) ([a-z_]+)$', "$\2 = '\1'")
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

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

;Возвращаем полученную строку
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) $sRet
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)

?
:hmm:

PCLAlex
16-06-2011, 07:03
Спасибо за ответ и новые идеи!!!У меня почему-то код ничего не выводит.Разбираюсь.

Creat0R
16-06-2011, 09:51
У меня почему-то код ничего не выводит »
Он выводит данные в консоль SciTE.

PCLAlex
16-06-2011, 13:53
Сегодня весь день методом тыка все истыкал.Получается лажа.Посмотрите что смастерил.
$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)
Укажите на ошибки!

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

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

Замени
ConsoleWrite(
на
MsgBox(64, '',
и не мучайся.

PCLAlex
16-06-2011, 16:13
Не много отвлекся от проблемы и решение почти появилось!!!
$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 огромное тебе спасибо!!!Я сегодня с твоей подачи написал свое первое регулярное выражение!!!

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

Creat0R
16-06-2011, 18:12
По идее результат вычисления должен быть TRUE а в этом примере он FALSE ???? »
Ну ты бы хоть проверял полученную строку:
MsgBox(0, '', $aFunc[0])
сразу видно что не все переменные преобразовываются.

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

PCLAlex
17-06-2011, 06:58
:up Спасибо за столь исчерпывающие ответы!Тема решена!Я думаю здесь многие как и я найдут для себя много полезного!Встретимся на других темах.Тема закрыта.




© OSzone.net 2001-2012