Изменение столбца в массиве

Я читаю файл CSV, который содержит 25 000 записей, и читаю каждый столбец в файле psobject. Вот что у меня есть до сих пор:

$file = Import-CSV .\server.csv
$tempobj = New-Object psobject -Property @{
    'Name' = $file.Name
    'Group' = $file.Group
}

Когда это запускается, я получаю правильные результаты, которые мне нужны, поскольку $file.Name содержит все имена серверов, а $file.Group содержит группы для серверов. Однако моя проблема в том, что мне нужно редактировать имена каждого сервера, не мешая файлу .Group. Вот пример того, как выглядит имя сервера.

WindowsAuthServer @{wdk9870WIN}

Мне нужно удалить WindowsAuthServer @{ и WIN} из каждого имени сервера, оставив только имя сервера, или, например, wdk9870.

Я пытался использовать функцию -replace ($tempobj.Name -replace "WindowsAuthServer @{",""), но для этого требуется сохранить результаты в новый массив, который затем искажает или полностью удаляет .Group

Есть ли другой способ сделать это? Я потерялся.


person JK72    schedule 18.12.2018    source источник
comment
Каждый столбец уже является pscustomobject, потому что вы используете Import-Csv. Вы дважды обрабатываете каждую запись. Кроме того, вы смотрите на строковое представление pscustomobject; строка не является буквально WindowsAuthServer @{wdk9870WIN}. Ключ WindowsAuthServer содержит значение wdk9870WIN.   -  person Maximilian Burszley    schedule 18.12.2018


Ответы (1)


Предположим, ваш server.csv выглядит так:

"Name","Group"
"WindowsAuthServer @{wdk9870WIN}","Group1"
"WindowsAuthServer @{wdk9880WIN}","Group2"
"WindowsAuthServer @{wdk9890WIN}","Group1"
"WindowsAuthServer @{wdk9900WIN}","Group1"

И вы хотите изменить значения только в столбце Name, тогда это, вероятно, сделает что-то вроде этого:

Import-Csv .\server.csv | ForEach-Object {
    New-Object psobject -Property @{
        'Name' = ([regex]'@\{(\w+)WIN\}').Match($_.Name).Groups[1].Value
        'Group' = $_.Group
    }
}

Это выведет:

Name    Group 
----    ----- 
wdk9870 Group1
wdk9880 Group2
wdk9890 Group1
wdk9900 Group1

При желании вы можете просто передать эту информацию командлету Export-Csv для сохранения в виде нового CSV-файла. Для этого просто добавьте | Export-Csv -Path .\server_updated.csv -NoTypeInformation к коду.

надеюсь, это поможет

person Theo    schedule 18.12.2018
comment
Крайне маловероятно, что их данные действительно выглядят так. Скорее всего, они смотрят на консоль и не понимают, что все в powershell является объектом, поэтому это строковое представление pscustomobject для печати в консоли. - person Maximilian Burszley; 18.12.2018
comment
@TheIncorrigible1 Да, это вполне может иметь место, хотя, если я посмотрю на предыдущий вопрос OP, я не могу быть Конечно.. - person Theo; 18.12.2018
comment
Уф. Я искренне надеюсь, что они не делают что-то вроде | Out-String | Out-File для csv. - person Maximilian Burszley; 18.12.2018