Powershell: установка значений отфильтрованного массива - PullRequest
0 голосов
/ 17 июня 2010

Я хочу прочитать в CSV-файл, отфильтровать его на основе значений двух поля и установите значение другого поля. Вот простой пример из того, что я пытаюсь достичь:

c: \ somefile.csv содержимое:

firstField,secondField,thirdField
1,2,"somevalue"
2,2,"avalue"
3,1,"somevalue"

#Import file into array
$csv = Import-Csv c:\somefile.csv

# Where secondField = 2 and thirdField = "someValue" set thirdField =
"anotherValue"
$csv | where {$_secondField -eq 2 -and $_.thirdField = "somevalue"} |
<set value of thirdField = "anotherValue">

Как я могу это сделать. Как видно из примера, я могу прочитать в и фильтровать массив. Но я не знаю, как тогда установить значение третье поле. Я пробовал set-itemproperty, но получил ошибку: Методы WriteObject и WriteError не могут быть вызваны после конвейера был закрыт ".

Редактировать: я также хотел бы изменить только на значение первых 2 возвращенных элементов (строк). Ответил мной: я использовал Select -first 2.

Буду признателен за любой совет, как этого добиться.

Алан Т

Ответы [ 2 ]

4 голосов
/ 17 июня 2010

Я немного изменил ваш код:

$csv | 
    Where-Object {$_.secondField -eq 2 -and $_.thirdField -eq 'somevalue'} |
    Foreach-Object { $_.thirdField = 'anotherValue' }
  • $_secondField => $_.secondField
  • $_.thirdField = "somevalue" должно быть $_.thirdField -eq "somevalue"
  • Foreach-Object устанавливает третье значение.В этом случае он обрабатывает только 1 запись, но в основном обрабатывает все записи, которые передаются по каналу (просто попробуйте удалить часть Where).
  • «безопаснее» использовать одинарные кавычки вместо двойныхкавычка из-за непреднамеренного расширения переменной.
2 голосов
/ 17 июня 2010

У вас правильная идея.Используйте Where-Object (с псевдонимом Where) для фильтрации объектов в конвейере, а затем далее по конвейеру используйте Foreach-Object (с псевдонимом Foreach) для установки значения следующим образом:

$csv | where {$_secondField -eq 2 -and $_.thirdField -eq "somevalue"} | 
    foreach {$_.thirdField = "notherValue"}

Подумайте, где-Объект как всего лишь механизм фильтрации, а Foreach-Object как механизм конвейера, который позволяет применять произвольный скрипт к каждому объекту конвейера.

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