Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Переформатировать текстовую строку в понятное для AutoIT выражение (http://forum.oszone.net/showthread.php?t=209051)

PCLAlex 15-06-2011 16:51 1694944

Переформатировать текстовую строку в понятное для AutoIT выражение
 
Здравствуйте форумчане.Нужна помощь.
Есть текстовая строка
Код:

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 1695220

Так пойдёт:

Код:

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

?
:hmm:

PCLAlex 16-06-2011 07:03 1695278

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

Creat0R 16-06-2011 09:51 1695335

Цитата:

Цитата PCLAlex
У меня почему-то код ничего не выводит »

Он выводит данные в консоль SciTE.

PCLAlex 16-06-2011 13:53 1695546

Сегодня весь день методом тыка все истыкал.Получается лажа.Посмотрите что смастерил.
Код:

$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. »

Поясни пожалуйста.

Creat0R 16-06-2011 15:27 1695612

Цитата:

Цитата PCLAlex
Поясни пожалуйста. »

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

Замени
Код:

ConsoleWrite(
на
Код:

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

PCLAlex 16-06-2011 16:13 1695662

Не много отвлекся от проблемы и решение почти появилось!!!
Код:

$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 1695766

Вложений: 1
Цитата:

Цитата PCLAlex
По идее результат вычисления должен быть TRUE а в этом примере он FALSE ???? »

Ну ты бы хоть проверял полученную строку:
Код:

MsgBox(0, '', $aFunc[0])
сразу видно что не все переменные преобразовываются.

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

PCLAlex 17-06-2011 06:58 1696071

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


Время: 14:49.

Время: 14:49.
© OSzone.net 2001-