none
Извлечение, арифметические операции, запись RRS feed

  • Вопрос

  • Доброго времени суток

    Имеется несколько файлов определенной структуры. С помощью метода Regex нахожу необходимые мне значения, далее произвожу над ними арифметические действия. А вот как мне записать уже новые значения на старые места в те же самые файлы?

    $x=get-content "C:\klaes\fen76\_baz2\Daten\*.F06" -encoding oem | Select-String  ^P~
    [regex]::Matches($x,'(?<=;)(\s?\d+.\d+)(?=;)') | ForEach-Object{
    $y=[double]$_.groups[1].value * 1.05
    '{0:N3}' -f $y
    }

    5 апреля 2016 г. 5:23

Ответы

  • Get-Content file.txt | Foreach {
    	if($_ -match "^P~") {
    		$str = $_.split(";",8)[5].Trim()
    		$new = "{0:N3}" -f ([double]$str * 1.05)
    		$_.replace($str,$new)
    	}
    	else {
    		$_
    	}
    }



    • Изменено KazunEditor 5 апреля 2016 г. 6:23
    • Помечено в качестве ответа nskalinin 5 апреля 2016 г. 7:03
    5 апреля 2016 г. 6:11
    Отвечающий

Все ответы

  • Пример файла и что меняем.
    5 апреля 2016 г. 5:53
    Отвечающий
  • P~   70688;   1;     110054;  Профиль для присоед.слива 30 мм Нейтральный цвет         ;   1; 1.000;    ;   ;
    P~   70688;   1;     111163;            Рама оконная Enwin 60 Белый                    ;   4; 1.006;    ;   ;
    P~   70688;   1;   113025_1;   Усилитель 30/30/1,5 П-образный Нейтральный цвет         ;   4; 0.900;    ;   ;
    P~   70688;   1; ROS0042.**;        *Заглушка водоотв. канала Белый                    ;   3; 0.000;Штук;   ;
    P~   70688;   1;     111257;         Створка оконная Enwin 60 Белый                    ;   4; 0.932;    ;   ;
    P~   70688;   1;    12R1407;                  Штапик под 32мм Белый                    ;   4; 0.808;    ;   ;
    P~   70688;   1;      207.1;              Армирование СТВОРКА Нейтральный цвет         ;   4; 0.796;    ;   ;
    F~   70688;       1;                     ;                                 Скр. средний прижим, створка;   1;
    F~   70688;       1;               109293;                                    подкладка под ф. вкладыш.;   4;
    F~   70688;       1;               109293;                                           Фальцевый вкладыш.;   4;
    F~   70688;       1;               227354;                                          Штифт верхней петли;   1;
    F~   70688;       1;               230177;                                  Петля на раме верх. K 3/100;   1;
    F~   70688;       1;               230205;                           *Накл. дек. верх. петля рам. белая;   1;
    F~   70688;       1;               230252;                           *Накл. дек. верх. петля ств. белая;   1;
    F~   70688;       1;               230343;                              Нижняя петля на створке K 3/100;   1;
    F~   70688;       1;               230426;                      *Накл. дек. нижн. петля рам. вкл. белая;   1;
    F~   70688;       1;               230491;                           *Накл. дек. нижн. петля ств. белая;   1;

    Меняются значения в каждой строке, написанные жирным подчеркнутым шрифтом
    5 апреля 2016 г. 6:02
  • Get-Content file.txt | Foreach {
    	if($_ -match "^P~") {
    		$str = $_.split(";",8)[5].Trim()
    		$new = "{0:N3}" -f ([double]$str * 1.05)
    		$_.replace($str,$new)
    	}
    	else {
    		$_
    	}
    }



    • Изменено KazunEditor 5 апреля 2016 г. 6:23
    • Помечено в качестве ответа nskalinin 5 апреля 2016 г. 7:03
    5 апреля 2016 г. 6:11
    Отвечающий
  • Get-ChildItem "C:\klaes\fen76\_baz2\Daten\*.F06" | ForEach-Object {
        $path=$_.FullName
        Get-Content $_ | ForEach-Object {
            if($_ -match "^P~") {
                $str = $_.split(";",8)[5].Trim()
    		    $new = "{0:N3}" -f ([double]$str * 1.05)
    		    $_.replace($str,$new)
            }
            else {
                $_
            }    
        } | Out-File $path 
    }
    

    Подскажите, почему исходные файлы становятся пустыми? Если передавать вывод результатов на консоль, то все в порядке.
    6 апреля 2016 г. 5:29
  • Get-ChildItem "C:\klaes\fen76\_baz2\Daten\*.F06" | ForEach-Object {
        $path=$_.FullName
    	$content = Get-Content $path 
        $content | ForEach-Object {
            if($_ -match "^P~") {
                $str = $_.split(";",8)[5].Trim()
    		    $new = "{0:N3}" -f ([double]$str * 1.05)
    		    $_.replace($str,$new)
            }
            else {
                $_
            }    
        } | Out-File $path 
    }

    6 апреля 2016 г. 5:41
    Отвечающий
  • Если Вас не затруднит объясните почему мой вариант не работал
    6 апреля 2016 г. 6:03
  • Если Вас не затруднит объясните почему мой вариант не работал

    В вашем случае, сначала выполняется операция FILE_OVERWRITE_IF, а уже после того происходит чтение файла, который уже перезаписан или заново создан.

    FILE_OVERWRITE_IF. If the file already exists, open it and overwrite it. If it does not, create the given file

    6 апреля 2016 г. 6:35
    Отвечающий