使用键作为列标题将散列表导出为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