Как заменить значение в текстовом файле с помощью сценария PowerShell - PullRequest
0 голосов
/ 06 августа 2020

Мой файл состоит из следующих данных (без заголовка)

DEPOSIT ADD     123456789 (VALUE)(VARIABLE) NNNN    VALUEVARIABLE                                                   
DEPOSIT ADD     234567890 (VALUE)(P75)  NNNN    VALUEVARIABLE                                               
DEPOSIT ADD     345678901 (VALUE)(VARIABLE) NNNN    VALUEVARIABLE           

Это текстовый файл с разделителями табуляции. Всего 5 столбцов. (123456789 (VALUE) (VARIABLE) - столбец с одним значением)

Мои требования:

  1. Мне нужно получить только строку, содержащую P75 , чтобы обновить в том же файле.
  2. Я должен заменить значения в Col3, Col4 и Col5 после получения P75 другие строки не должны быть затронуты.

из От

DEPOSIT ADD     234567890 (VALUE)(P75)  NNNN    VALUEVARIABLE

до

DEPOSIT ADD     234567890 (VTG)(SPVTG)  TCM    VTGSPVTG
Только записи, содержащие P75, должны обновляться таким образом. Значения замены одинаковы для всех выбранных записей.

Мой сценарий, который я написал:

$original_file='C:\Path\20200721130155_copy.txt' -header Col1,Col2,Col3,Col4,Col5,| Select Col3,Col4,Col5

(Get-Content $original_file) |ForEach-Object {

    if($_.Col3 -match '(VALUE)(P75)')
    {
    $_ -replace '(VALUE)(P75)', '(VTG)(SPVTG)' `
       -replace 'VALUEVARIABLE', 'VTGSPVTG' `
       -replace 'NNNN', 'TCM' `
    } 
    $_
    }| Set-Content $original_file+'_new.txt' -Force
 

Я получаю выходной файл с таким же содержимым. Файл не обновляется.

Пожалуйста, посоветуйте.

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Вы можете использовать Import-Csv -Delimiter "`t" для импорта данных исходного файла. Затем l oop над элементами и измените значения, если Col3 соответствует поисковому тексту.

$original_file = 'C:\Path\20200721130155_copy.txt'
$out_file      = $original_file -replace '\.txt$', '_new.txt'

(Import-Csv -Path $original_file -Delimiter "`t" -Header 'Col1','Col2','Col3','Col4','Col5') | ForEach-Object {
    if( $_.Col3 -like '*(*)*(P75)') {
        $_.Col3 = $_.Col3 -replace '\([^)]+\)\(P75\)$', '(VTG)(SPVTG)'
        $_.Col4 = 'TCM'
        $_.Col5 = 'VTGSPVTG'
    } 
    # rejoin the fields and output the line
    $_.PsObject.Properties.Value -join "`t"
} | Set-Content -Path $out_file -Force

Результат будет

DEPOSIT ADD 123456789 (VALUE)(VARIABLE) NNNN    VALUEVARIABLE
DEPOSIT ADD 234567890 (VTG)(SPVTG)  TCM VTGSPVTG
DEPOSIT ADD 345678901 (VALUE)(VARIABLE) NNNN    VALUEVARIABLE

Детали регулярного выражения для -replace:

\(        Match the character “(” literally
[^)]      Match any character that is NOT a “)”
   +      Between one and unlimited times, as many times as possible, giving back as needed (greedy)
\)        Match the character “)” literally
\(        Match the character “(” literally
P75       Match the characters “P75” literally
\)        Match the character “)” literally
$         Assert position at the end of the string (or before the line break at the end of the string, if any)
0 голосов
/ 06 августа 2020

Вы можете сделать следующее:

$newfile = "{0}_new.txt" -f $original_file
Get-Content $original_file | Foreach-Object {
    if ($_ -match '\(VALUE\)\(P75\)') {
        $_ -replace '\(VALUE\)\(P75\)','(VTG)(SPVTG)' -replace 'VALUEVARIABLE', 'VTGSPVTG' -replace 'NNNN', 'TCM'
    } else {
        $_
    }
} | Set-Content $newfile -Force

Поскольку -replace использует регулярное выражение, вы должны backsla sh экранировать специальные символы регулярного выражения, такие как ( и ).

Поскольку $_ - это текущая строка, читаемая из Get-Content без -Raw, вам нужно будет вывести $_, если вы не хотите вносить изменения. Если вы действительно хотите заменить текст, то $_ -replace 'regex','text' выведет эту строку с замененным текстом.

В качестве альтернативы вы можете применить тот же logi c, указанный выше, в операторе switch, который более эффективен:

$newfile = "{0}_new.txt" -f $original_file
$(switch -regex -file $original_file {
    '\(VALUE\)\(P75\)' {
        $_ -replace '\(VALUE\)\(P75\)','(VTG)(SPVTG)' -replace 'VALUEVARIABLE', 'VTGSPVTG' -replace 'NNNN', 'TCM'
    }
    default { $_ }
}) | Set-Content $newfile -Force
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...