Ваш ввод выглядит в формате CSV (хотя учтите, что в строках вашего образца есть конечные пробелы, с которыми вам придется иметь дело, если они являются частью ваших фактических данных).
Поэтому используйте Import-Csv
и Export-Csv
для чтения / перезаписи ваших данных, что позволяет получить более краткое и удобное решение:
Import-Csv test.txt |
Select-Object user, @{ Name='group'; Expression = { $lookupTable[$_.group] } } |
Export-Csv -NoTypeInformation -Encoding Utf8 test2.txt
Import-Csv
считывает файл CSV как коллекцию пользовательских объектов , свойства которых соответствуют значениям столбца CSV;то есть каждый объект имеет свойство .user
и .name
в вашем случае.
$_.group
, поэтому надежно сообщает только абстрактное имя группы, которое вы можете напрямую передать вашемупоиск по хеш-таблице;Select-Object
используется для передачи исходного значения .user
и замены исходного значения .group
результатом поиска, используя вычисленное свойство .
Export-Csv
повторно преобразовывает пользовательские объекты в файл CSV:
-NoTypeInformation
подавляет (обычно бесполезную) строку информации о типе данных в верхней части выходного файла -Encoding Utf8
было добавлено для предотвращения возможной потери данных, поскольку по умолчанию используется кодировка ASCII. - Обратите внимание, что
Export-Csv
вслепую двойные кавычки все значения полей, нужно им это или нет;Тем не менее, читатели CSV должны быть в состоянии справиться с этим (и Import-Csv
, безусловно, делает).
Что касается то, что вы пытались :
Оператор -replace
заменяет все вхождения данного регулярного выражения (регулярного выражения) во входных данных.
Ваши регулярные выражения сводятся к поиску (без учета регистра) подстрок , которая объясняет, почему HR
соответствует как HR
имени группы, так и подстроке hr
в имени пользователя gilchrist
.
Простой обходной путь - добавить утверждения в регулярное выражение, чтобы подстроки соответствовали толькогде вы хотите их;Например: ,HR$
будет соответствовать только после ,
в конце строки ($
).
Однако ваш подход перечисления ключей хеш-таблицы для каждой входной строки CSV неэффективен, и вылучше разделить имя группы и выполнить прямой поиск на его основе:
# Split the row into fields.
$fields = $line -split ','
# Update the group value (last field)
$fields[-1] = $lookupTable[$fields[-1]]
# Rebuild the line
$line = $fields -join ','
Обратите внимание, что вам нужно сделать исключение для строки заголовка (например, проверить, является ли результат поискапусто и воздерживаться от обновления, если это так).