Каков простой и эффективный способ преобразования массива с помощью PowerShell? Исходный массив имеет два свойства Number и Color.

Number  Color
1       Red
2       Red
3       Red
4       Red
5       Blue
6       Blue
7       Green
8       Green
9       Green

Выходной массив должен выглядеть так:

Color   Number
Red     1,2,3,4
Blue    5,6
Green   7,8,9
2
dod 29 Апр 2020 в 01:00

2 ответа

Лучший ответ
# Input objects.
$objects = @'
Number,Color
1,Red
2,Red
3,Red
4,Red
5,Blue
6,Blue
7,Green
8,Green
9,Green
'@ | ConvertFrom-Csv

$objects |
  Group-Object Color |
    Select-Object @{ n='Color'; e='Name'}, @{ n='Number'; e={ $_.Group.Number } }

Вышеуказанные выходы:

Color Number
----- ------
Blue  {5, 6}
Green {7, 8, 9}
Red   {1, 2, 3, 4}

Смотрите также:

2
mklement0 29 Апр 2020 в 00:57

Добавление в @ mklement0's отличный ответ, используя Group-Object мы также можем сгруппировать элементы в System.Collections.Hashtable добавив переключатель -AsHashTable. Для итерации ключей и значений хеш-таблицы мы должны использовать System.Collections.Hashtable.GetEnumerator.

$objects = @'
Number,Color
1,Red
2,Red
3,Red
4,Red
5,Blue
6,Blue
7,Green
8,Green
9,Green
'@ | ConvertFrom-Csv

$ht = $objects | Group-Object -Property Color -AsHashTable

$ht.GetEnumerator() | 
    Select-Object @{Name="Color";Expression={$_.Key}}, @{Name="Number";Expression={$_.Value | Select-Object -ExpandProperty Number}}

Выход:

Color Number
----- ------
Green {7, 8, 9}
Red   {1, 2, 3, 4}
Blue  {5, 6}

Если мы хотим отсортировать ваш результат по Number, мы можем использовать Sort-Object для сортировки по первому номеру:

$ht.GetEnumerator() | 
    Select-Object @{Name="Color";Expression={$_.Key}}, @{Name="Number";Expression={$_.Value | Select-Object -ExpandProperty Number}} |
        Sort-Object @{Expression={$_.Number[0]}}

Или используйте {{X0 }} для создания упорядоченного хэш-таблицы массивов и поддержания порядка вставки ключей:

$ht = [ordered]@{}
foreach ($object in $objects) {
    if (-not ($ht.Keys -contains $object.Color)) {
        $ht[$object.Color] = @()
    }
    $ht[$object.Color] += $object.Number
}

$ht.GetEnumerator() | 
    Select-Object @{Name="Color";Expression={$_.Key}}, @{Name="Number";Expression={$_.Value}} 

Который выведет следующее:

Color Number
----- ------
Red   {1, 2, 3, 4}
Blue  {5, 6}
Green {7, 8, 9}
0
RoadRunner 29 Апр 2020 в 04:43