2013-07-20 2 views
2

У меня есть CSV, как показано ниже:Powershell Hash Таблица Группировка

location,id 
loc1,1234 
loc1,1235 
loc1,1236 

Запуск $ а = Import-CSV C: \ FILE.CSV | Group-Object «место» Я получаю следующий вывод:

Count Name Group 
----- ---- ----- 
3  loc1 {@{location=loc1; id=1234}, @{location=loc1; id=1235), @{location=loc1, id=1236}} 

Я хотел бы добавить все идентификаторы в одной группе (с помощью Add-QADGroupMember), но я не могу понять, как получить группу идентификаторов для $ loc1. Кажется, они правильно группируют их, но я не могу разобрать вывод в одну группу. Например, $ loc1 = 1234,1235,1236, с которым я могу пройти.

Любые предложения будут оценены!

ответ

0

немного сложнее, но это будет сделать это:

Import-Csv C:\File.csv | Group-Object "location" | %{Set-Variable ($_.Name) ($_.Group | Select-Object -ExpandProperty id)} 

После запуска этого $ LOC1, $ LOC2 и т.д. будут массивы всех идентификаторов для каждого места.

+0

I _knew_ Я уже думал об этом. Это именно то, что я искал!Наличие переменной для каждого местоположения позволяет мне сравнивать существующих членов группы и обновлять/удалять по мере необходимости. Благодаря! – user2601449

3

Group-Object не справляется с hashtables, так как ключи не являются реальными свойствами.

Предполагая:

$csv = Import-CSV C:\File.csv 

Вы должны быть в состоянии сделать, например:

$ids = $csv | %{ $_.id } 

, чтобы получить массив значений ID. Вероятно, вы захотите проехать через Get-Unique для местоположения.

Если вы хотите, чтобы получить место для быстро одной ID:

$location = $csv | ?{ $_.id -eq 42 } | %{ $_.location } 

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

$loc1 = $csv | ?{ $_.location -eq 'loc1' } 

для справки, если вы хотите, чтобы получить хэш-таблицу отображения каждого местоположения на массив идентификаторов:

$groups = $csv | %{ $_.location } | &{ 
    begin 
    { 
     $hash = @{} 
    } 
    process 
    { 
     $location = $_.location 
     $hash[$location] = $csv | ?{ $_.location -eq $location } 
    } 
    end 
    { 
     $hash 
    } 
} 
+0

Я согласен, что он хочет получить массивы идентификаторов для каждого местоположение, но '$ loc1 = $ csv | ? {$ _. location -eq 'loc1'} 'не будет работать. Это немного сложнее, чем на первый взгляд. ** $ csv ** - массив объектов GroupInfo. Трубопровод через это **, где ** блок будет оценивать значение null. Ему нужно получить свойство **. Group ** каждого элемента ** $ csv **, который является объектом коллекции со свойствами для каждого столбца в файле CSV; затем подключите этот объект коллекции к 'select -ExpandProperty id', который создает массив значений свойства id. –

+0

@AdiInbar Нет, они являются только объектами «GroupInfo» после того, как они были переданы через «Групповой объект». Я советую ** не ** трубить через «Групповой объект». Это просто усложняет ситуацию. – Zenexer

0

И еще один вариант:

(Import-Csv c:\foo.csv | Group Location -AsHashTable).Loc1 | Foreach {$_.id} 

И если вы на V3, вы можете сделать это:

(Import-Csv c:\foo.csv | Group Location -AsHashTable).Loc1.Id 
Смежные вопросы