Обновление строкового значения со ссылкой на таблицу - Powershell - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть скрипт для обновления строкового значения в файле калибровки, но я действительно застрял в обосновании обновления на следующей таблице поиска:

Level   PARALLEL_VOLTAGE_TEST   PARALLEL_VOLTAGE_REF
1   85  250
2   90  250
3   95  250
4   100 250
5   105 250
6   110 250
7   115 250
8   120 250
9   125 250
10  130 250
11  135 250
12  140 250
13  145 250
14  150 250
15  155 250
16  160 250
17  165 250
18  170 250
19  175 250
20  180 250
21  185 250
22  190 250
23  195 250
24  200 250
25  205 250
26  205 245
27  205 240
28  205 235
29  205 230
30  205 225
31  205 220
32  205 215
33  205 210
34  205 205
35  205 200
36  205 195
37  205 190
38  205 185
39  205 180
40  205 175
41  205 170
42  205 165
43  205 160
44  205 155
45  205 150
46  205 145
47  205 140
48  205 135
49  205 130
50  205 125

Например, если входной файл имеетстрока со значением PARALLEL_VOLTAGE_TEST 85 и значением PARALLEL_VOLTAGE_TEST 185, мне нужно найти эту пару значений в таблице и заменить значения на значения из 20 уровней (строк таблицы) ниже. Если такой строки нет, следует использовать значения из строк таблицы last .

Вот пример кода с парой значений в жестком коде *1009*, (85, 250)(уровень 1), который следует заменить значениями из уровня 21, (185, 250), но мне нужно обобщить этот подход для работы со всеми парами значений:

$file = 'C:\Users\sugas\Desktop\Test\*.cal'
$VTEST = (Get-Content $file | select-string "PARALLEL_VOLTAGE_Test")
$VREF = (Get-Content $file | select-string "PARALLEL_VOLTAGE_REF")

if (($VTEST-imatch 'PARALLEL_VOLTAGE_Test 85') -and ($VREF-imatch 'PARALLEL_VOLTAGE_REF 250')) {
(Get-Content $file).replace($VTEST,'PARALLEL_VOLTAGE_Test 185')| Set-Content $file
(Get-Content $file).replace($VREF,'PARALLEL_VOLTAGE_REF 250') | Set-Content $file
}

1 Ответ

0 голосов
/ 03 ноября 2019

Вы можете принять следующий подход:

  • Чтение таблица значений и перевести его в хэш-таблицу, которая отображает пары теста напряжение, опорное напряжение на их сдвинуто-на-20-entries значения, или, если такой записи не существует, к последней записи таблицы.

  • Поиск строк во входных файлах, которые содержат и испытательное напряжение и ссылкузаписи -voltage:

    • Извлеките значения напряжения из этих линий,
    • найдите их в хеш-таблице,
    • и замените значения их смещенными значениями.

Следующее решение демонстрирует этот подход:

# Read the table into objects.
# The -replace operation compresses runs of multiple spaces into one space
# each, so that ConvertFrom-Csv -Delimeter ' ' can be used to read the 
# input as a CSV file.
$table =
  (Get-Content -Raw table.txt) -replace '  +', ' ' | ConvertFrom-Csv -Delimiter ' '

# Create a hashtable that maps (test voltage, ref voltage) pairs to their
# new values, 20 items lower in the table, defaulting to the last table entry
# if there is no such item.
$maxNdx = $table.Count - 1
$voltageMap = [ordered] @{}
foreach ($i in 0..$maxNdx) {
  # Determine the index of the table entry with the shifted values.
  $targetIndex = [math]::Min(20 + $i, $maxNdx)
  # Note: We use a *string* key that is the space-separated concatenation 
  #       of the test and ref values (e.g., '85 100'), 
  $voltageMap["$($table[$i].PARALLEL_VOLTAGE_TEST, $table[$i].PARALLEL_VOLTAGE_REF)"] = $table[$targetIndex].PARALLEL_VOLTAGE_TEST, $table[$targetIndex].PARALLEL_VOLTAGE_REF
}

$reTest = '\b(?<label>PARALLEL_VOLTAGE_TEST +)(?<test>\d+)\b'
$reRef  = '\b(?<label>PARALLEL_VOLTAGE_REF +)(?<ref>\d+)\b'

# Loop over all *.cal files
Get-Item *.cal | ForEach-Object {
  # Process each file line by line.
  $modifiedLines = 
    switch -File $_.FullName -Regex {
      # A line that contains both PARALLEL_VOLTAGE_TEST and PARALLEL_VOLTAGE_REF values, in either sequence.
      "$reTest.*$reRef|$reRef.*$reTest" {
        # Using the capture-group values, look up the shifted voltage values.
        $newTest, $newRef = $voltageMap["$($Matches.test, $Matches.ref)"]
        if ($newTest) { # Match in table found, replace voltage values in the line at hand.
          $_ -replace $reTest, "`${label}$newTest" -replace $reRef, "`${label}$newRef"
        } else { # no match in table found, pass line through
          $_ 
        }
      }
      default { $_ } # Pass all other lines through.
    }
  # Echo the modified lines.
  $modifiedLines
  # NOTE: In order to write the modified lines back to the input file,
  #       uncomment the next line.
  # $modifiedLines | Set-Content $_.FullName
}

Примечание. Если значения PARALLEL_VOLTAGE_TEST и PARALLEL_VOLTAGE_REF не обязательно находятся в одной строкеи есть только одна пара значений для файла:

  • Используйте $content = Get-Content -Raw $_.FullName внутри блока сценария ForEach-Object, чтобы прочитать весь файл в одной строке

  • Префикс объединенного регулярного выражения с (?s), чтобы . соответствовал newliи тоже.

  • Используйте if ($content -match ...) вместо оператора switch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...