none
PowerShell и числа RRS feed

  • Вопрос

  • Как в PoSh можно парсить тесктовый файл так, чтобы если попадается число (отрицательное/положительное), то его умножить на 5, например?


    MCTS, MCITP:EPM
    9 сентября 2010 г. 12:22

Ответы

  • если исходить из того, что в каждой строке содержится только одно единственное число, то код очень простой:

    switch -regex (get-content "c:\temp\1.txt")
    {
        "-?\d+" {"Найденное_число*5="+5*$matches[0]}
    }

    Если же в одной строке может присутствовать сразу несколько чисел, тогда можно сделать, например, так:

    switch -regex (get-content "c:\temp\1.txt")
    {
        "-?\d+" {
            #в текущей строке имеется по крайней мере одно число
            #выполним поиск всех чисел, имеющихся в строке
            $objMyMatches=[regex]::Matches($_,"(-?\d+)")
            #умножим каждое найденное число на 5     
            $objMyMatches | Foreach-Object {"Найденное_число*5="+5*$_.groups[1].value}
        }
    }

     

    PS Информацию к размышлению берем у Василия:

    http://xaegr.wordpress.com/2010/02/24/regexp-8-switch/

    http://xaegr.wordpress.com/2010/04/09/regexp-8-regex/


    blog: http://shss.wordpress.com/
    • Помечено в качестве ответа Denis Kichin 10 сентября 2010 г. 9:27
    9 сентября 2010 г. 20:43
  • Да, спасибо работает. Правда в моем случае, число в формате 123.1234 , т.е. разделитель точка. Скрипт же воспринимает его как два числа
    MCTS, MCITP:EPM


    Да, я не подумал, про то, что число может быть вещественным. Но это поправимо, надо всего лишь заменить регулярное выражение "(-?\d+)" на "(-?\d+((?:\.\d)(?:\d+))?)" (надеюсь, что я не ошибся)

     

    Информацию к размышлению, как обычно, берем у Василия: http://xaegr.wordpress.com/2009/12/11/regexp-4-captures/

     

    Upd Таки ошибся, правильнее будет такой регэксп: "(-?\d+(?:\.\d(?:\d*))?)"

    Upd2 Че-то я лишних групп захвата наворотил. Вот так будет проще: "(-?\d+(?:\.\d\d*)?)"

    Upd3 Еще чуть-чуть упростим: "(-?\d+(?:\.\d+)?)"


    blog: http://shss.wordpress.com/
    • Помечено в качестве ответа Denis Kichin 14 сентября 2010 г. 13:07
    10 сентября 2010 г. 10:13

Все ответы

  • если исходить из того, что в каждой строке содержится только одно единственное число, то код очень простой:

    switch -regex (get-content "c:\temp\1.txt")
    {
        "-?\d+" {"Найденное_число*5="+5*$matches[0]}
    }

    Если же в одной строке может присутствовать сразу несколько чисел, тогда можно сделать, например, так:

    switch -regex (get-content "c:\temp\1.txt")
    {
        "-?\d+" {
            #в текущей строке имеется по крайней мере одно число
            #выполним поиск всех чисел, имеющихся в строке
            $objMyMatches=[regex]::Matches($_,"(-?\d+)")
            #умножим каждое найденное число на 5     
            $objMyMatches | Foreach-Object {"Найденное_число*5="+5*$_.groups[1].value}
        }
    }

     

    PS Информацию к размышлению берем у Василия:

    http://xaegr.wordpress.com/2010/02/24/regexp-8-switch/

    http://xaegr.wordpress.com/2010/04/09/regexp-8-regex/


    blog: http://shss.wordpress.com/
    • Помечено в качестве ответа Denis Kichin 10 сентября 2010 г. 9:27
    9 сентября 2010 г. 20:43
  • Да, спасибо работает. Правда в моем случае, число в формате 123.1234 , т.е. разделитель точка. Скрипт же воспринимает его как два числа
    MCTS, MCITP:EPM
    10 сентября 2010 г. 9:30
  • Да, спасибо работает. Правда в моем случае, число в формате 123.1234 , т.е. разделитель точка. Скрипт же воспринимает его как два числа
    MCTS, MCITP:EPM


    Да, я не подумал, про то, что число может быть вещественным. Но это поправимо, надо всего лишь заменить регулярное выражение "(-?\d+)" на "(-?\d+((?:\.\d)(?:\d+))?)" (надеюсь, что я не ошибся)

     

    Информацию к размышлению, как обычно, берем у Василия: http://xaegr.wordpress.com/2009/12/11/regexp-4-captures/

     

    Upd Таки ошибся, правильнее будет такой регэксп: "(-?\d+(?:\.\d(?:\d*))?)"

    Upd2 Че-то я лишних групп захвата наворотил. Вот так будет проще: "(-?\d+(?:\.\d\d*)?)"

    Upd3 Еще чуть-чуть упростим: "(-?\d+(?:\.\d+)?)"


    blog: http://shss.wordpress.com/
    • Помечено в качестве ответа Denis Kichin 14 сентября 2010 г. 13:07
    10 сентября 2010 г. 10:13