使用键作为列标题将散列表导出为CSV

我有一个脚本来创build一个用户名作为键和他们的组数组作为值的哈希表。

这是它的样子:

 名称值
 ---- -----
 user1 {Domain Users,group2,group3}
 user2 {Domain Users,group4}
 user3 {Domain Users,group2,group3,group4} 

我怎样才能使用用户名作为标题导出到CSV文件?

当我将CSV文件导入到Excel中时,我希望它看起来像这样:

  ABC
   -------------------------------------------
 1 |  user1 user2 user3
 2 | 域用户域用户域用户
 3 |  group2 group4 group2
 4 |  group3 group3
 5 | 组4 

我已经玩过Export-Csv但是无法使用这种types的散列表。

为了能够获得数组作为列,你需要“转置”你的哈希表,这意味着你需要build立具有用户名(哈希表的键)作为属性的单个对象。 您需要创build的对象数量由数组中元素的最大数量来定义。

基本上,你需要把你的散列表分成多个散列表,每个散列表的所有键只有一个string值而不是一个string数组。 本质上,你需要改变这一点:

 @{ 'user1' = 'Domain Users', 'group2', 'group3' 'user2' = 'Domain Users', 'group4' 'user3' = 'Domain Users', 'group2', 'group3', 'group4' } 

进入这个:

 @{'user1' = 'Domain Users'; 'user2' = 'Domain Users'; 'user3' = 'Domain Users'} @{'user1' = 'group2'; 'user2' = 'group4'; 'user3' = 'group2'} @{'user1' = 'group3'; 'user2' = ''; 'user3' = 'group3'} @{'user1' = ''; 'user2' = ''; 'user3' = 'group4'} 

并从这些单独的哈希表创build对象。

 $ht = @{ 'user1' = 'Domain Users', 'group2', 'group3' 'user2' = 'Domain Users', 'group4' 'user3' = 'Domain Users', 'group2', 'group3', 'group4' } # list array lengths and get highest number $cnt = $ht.Values | ForEach-Object { $_.Count } | Sort-Object | Select-Object -Last 1 $keys = $ht.Keys | Sort-Object 0..($cnt-1) | ForEach-Object { $props = [ordered]@{} foreach ($key in $keys) { $props[$key] = $ht[$key][$_] } New-Object -Type PSObject -Property $props } | Export-Csv 'C:\path\to\output.csv' -NoType 

你可以从哈希表中创build一个psobject:

 $ht = [ordered]@{ user1 = @("Domain Users", "group2", "group3") user2 = @("Domain Users", "group4") user3 = @("Domain Users", "group2", "group3", "group4") } New-Object psobject -Property $ht | Export-Csv -Path '.\output.csv' -NoTypeInformation 

如果hashtable$ht )没有sorting(如上例),则可以使用Select-Object对标题sorting:

 New-Object psobject -Property $ht | Select-Object ($ht.Keys |Sort-Object) | Export-Csv -Path '.\output.csv' -NoTypeInformation 

在你的例子中,这些值是集合,并将在csv文件中输出typename System.Object[]

您可以将值复制到新的散列表,并在创build对象之前用-join连接string:

 $ht = ($keys = $ht.Keys) | ForEach-Object -Begin { $ht2 = @{} } -Process { $ht2[$_] = $ht[$_] -join ", " } -End { $ht2 } New-Object psobject -Property $ht | Select-Object ($keys |Sort-Object) | Export-Csv -Path '.\output.csv' -NoTypeInformation