Powershell получает случайную группу по идентификатору - PullRequest
1 голос
/ 07 ноября 2019

Мне нужно сгруппировать объекты, которые были получены случайным образом, на основе идентификатора, который могут совместно использоваться двумя объектами.

Вот мой текущий скрипт:

$allRows = Import-CSV C:\Temp\pk.csv

$chosenHouseholdIDs = ($allRows | Get-Random -Count $allRows.count).id

$chosenOnes = $allRows | Where-Object id -in $chosenHouseholdIDs

$i = 1

foreach ($chosenOne in $chosenOnes)
{
     "$($i),$($chosenOne.name)"
     $i = $i + 1
}

Файл pk.csv содержит 130 строк. У каждой строки есть имя и идентификатор домохозяйства. Цель идентификатора домохозяйства - связать близнецов. Поэтому, если один близнец вытянут случайным образом, то другой близнец должен вытянуть следующий, или их нужно сгруппировать.

Пример ввода выглядит следующим образом:

householdID,name
7745,Josiah Moon
7746,Finleigh Hayes
7747,Evelyn Brandon
7749,Braedyn Thompson
7750,William Doughty
7751,Madison Vaughn
7751,Morgan Vaughn
7752,Peyton Benford
7753,Robert Waldrop
7754,Johnathan Ford
7755,Cheyenne Holmes
7756,Reid Ruark

Ожидаемый результат будет чем-токак это:

rowNumber,householdID,name
1,7750,William Doughty
2,7752,Peyton Benford
3,7753,Robert Waldrop
4,7755,Cheyenne Holmes
5,7747,Evelyn Brandon
6,7745,Josiah Moon
7,7746,Finleigh Hayes
8,7756,Reid Ruark
9,7751,Morgan Vaughn
10,7751,Madison Vaughn
11,7754,Johnathan Ford
12,7749,Braedyn Thompson

Обратите внимание, что два имени с идентификатором домохозяйства 7751 перечислены в случайном порядке, но последовательно в списке. Идентификатор домохозяйства не обязательно должен быть частью результата. Я просто включил это здесь в целях иллюстрации.

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Если допустимо изменить порядок элементов, если идентичные идентификаторы домохозяйств сгруппированы вместе, вы можете сделать следующее (для краткости я опускаю код форматирования выходных данных):

$chosenOnes | Group-Object householdID | ForEach-Object Group 

Это выполнит требуемую группировку, но вернет элементы, отсортированные по идентификатору домохозяйства.

Свойство .Group экземпляров Microsoft.PowerShell.Commands.GroupInfo, выводимых командлетами Group-Object, содержит членов каждой группы и простовывод каждого члена группы приводит к плоскому массиву входных элементов, но с группировкой.


Если допустимо рандомизировать порядок снова , используйте:

$chosenOnes | Group-Object householdID | 
  Get-Random -Count $chosenOnes.Count | ForEach-Object Group

Потребовалось бы больше работы, если вы хотите сохранить первоначальный заказ и только выборочно вставить элементы с одинаковым идентификатором домохозяйства после их первого появления.

0 голосов
/ 07 ноября 2019

Используйте командлет Group-Object. Как это

$chosenOnes = $allRows | Where-Object id -in $chosenHouseholdIDs | Group-Object -Property householdID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...