Как иметь несколько значений для одного ключа в хэш-таблице из CSV - PullRequest
0 голосов
/ 21 января 2020

Я попытался создать пустую хеш-таблицу, импортировать CSV, сгруппировать вещи по ID, а затем добавить каждую группу в хеш-таблицу.

Но по какой-то причине я получаю ошибку:

Exception calling "Add" with "2" argument(s): "Key cannot be null.
Parameter name: key"
At line:4 char:5
+     $myHT.add($_.Name,$_.Group.Name)
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentNullException

Затем я попробовал следующее, что гораздо ближе к желаемому результату:

$myCSV = Import-Csv "X:\Path\To\My\CSV\File.csv"
$myCSV | Group-Object -Property ID | Select-Object -Property @{N="ID";E={$_.Name}},@{N="Name";E={$_.Group.Name -join ","}}

Однако, если у меня все еще есть дубликаты, если у меня есть то же имя с тем же идентификатором в моем CSV. Есть ли способ получить уникальные имена? В настоящее время я получаю следующее:

ID    Name
1234  John, John, Jeff
1235  Jane
1236  Bob

Я хочу добавить имя только один раз, если оно уже существует.

Ответы [ 3 ]

2 голосов
/ 21 января 2020

Если вам нужна хеш-таблица, то самым простым способом было бы создать пустую, импортировать CSV, сгруппировать вещи по ID, а затем добавить каждую группу в хеш-таблицу.

$myHT = @{}
$myCSV = Import-Csv "X:\Path\To\My\CSV\File.csv"
$myCSV | Group ID | ForEach-Object {
    $myHT.add($_.Name,$_.Group.Name)
}

То, что выиграло ' между именами нужно ставить «,», но каждый ключ в хеш-таблице будет иметь значение, представляющее собой массив имен.

0 голосов
/ 22 января 2020

Я думаю, я понял это. Вы можете использовать Group-Object с некоторыми вычисленными свойствами, чтобы получить желаемый результат.

$myCSV = Import-Csv "X:\Path\To\My\CSV\File.csv"
$myCSV | Select-Object -Property ID,Name -Unique | Group-Object -Property ID | Select-Object -Property @{N="ID";E={$_.Name}},@{N="Name";E={$_.Group.Name -join ","}}
0 голосов
/ 22 января 2020

Вам необходимо де-дуплексировать $_.Group.Name элементы, используя другой Select-Object или Sort-Object, как показано ниже:

Используя ваш пример csv:

ID,Name
1234,John
1235,Jane
1236,Bob
1234,Jeff
$myCSV = Import-Csv "D:\test\input.csv" | Group-Object -Property ID | 
    Select-Object @{Name = "ID";   Expression = {$_.Name}},
                  @{Name = "Name"; Expression = {($_.Group.Name | Select-Object -Unique) -join ","}}

$myCSV

Выход:

ID   Name     
--   ----     
1234 John,Jeff
1235 Jane     
1236 Bob
...