Заменить строки в свойствах пользовательских объектов PSO в массиве - PullRequest
0 голосов
/ 21 октября 2019

Я читаю файл CSV в массив объектов (используя Import-Csv). Если я записываю эти данные обратно на диск с Export-Csv, я получаю именно то, что ожидал, хорошо отформатированный CSV.

Теперь мне нужно изменить некоторые данные в этом CSV. Одной из них являются строки, которые необходимо заменить. Но если я сделаю простое:

$thisIsTheArrayOfObjects -replace "Old ID", "New ID" 

, это приведет к массиву STRINGS. (замена произошла, но каким-то образом все мои объекты в массиве были преобразованы в строки)

Конечно, теперь Export-Csv не дает ожидаемого результата. Это просто экспорт файла со всей длиной строк в моем массиве.

Как заменить строки в свойствах PSOBJECTS в массиве?

1 Ответ

3 голосов
/ 21 октября 2019

Как заменить строки в свойствах PSOBJECTS в массиве?

Вы делаете это для каждого объекта.

$thisIsTheArrayOfObjects | ForEach-Object {
    $_.foo = $_.foo -replace "Old ID" , "New ID" # replace string in a property
    $_                                           # output the object back onto the pipeline
}

Имейте в виду, что естьдве ошибки с -replace:

  • Работает с регулярным выражением. Технически вы должны выполнить regex-escape первый параметр ([regex]::escape("Old ID")), если вы хотите выполнить замену literal , если только «Old ID» не содержит символов, которые являются специальными в regex. Если это происходит от пользовательского ввода, всегда разумно избегать его.
  • Он не чувствителен к регистру.

Чтобы сделать буквенные замены с учетом регистра, используйте .NET-native String.Replace(), который также доступен:

$thisIsTheArrayOfObjects | ForEach-Object {
    $_.foo = $_.foo.Replace("Old ID", "New ID") # replace string in a property
    $_                                          # output the object back onto the pipeline
}

Чтобы применить операцию к каждому столбцу в данных CSV, необходимо создать вложенный цикл. Командлет Get-Member может помочь. Принцип остается тем же, что и выше.

Import-Csv "input.csv" -PipelineVariable row | ForEach-Object {
    $row | Get-Member -MemberType NoteProperty -PipelineVariable col | ForEach-Object {
        $colname = $col.Name
        $row.$colname = $row.$colname -replace "Old ID", "New ID"
        $row
    }
} # | Export-Csv "output.csv"

Обратите внимание на использование переменных конвейера, чтобы обойти любую путаницу $_ внутри внутреннего цикла.

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