将哈希表导出为CSV,并将键作为列标题

时间:2015-07-16 22:12:26

标签: excel csv powershell

我有一个脚本来创建一个哈希表,其中用户名作为键,其组的数组作为值。

这是它的样子:

Name                           Value
----                           -----
user1                          {Domain Users, group2, group3}
user2                          {Domain Users, group4}
user3                          {Domain Users, group2, group3, group4}

如何使用用户名作为标题将其导出为CSV文件?

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

     A              B             C
  -------------------------------------------
1 | user1         user2         user3
2 | Domain Users  Domain Users  Domain Users
3 | group2        group4        group2
4 | group3                      group3
5 |                             group4

我玩过Export-Csv但是无法让它适用于这种类型的哈希表。

2 个答案:

答案 0 :(得分:4)

为了能够将数组作为列,您需要"转置"您的哈希表,这意味着您需要构建具有用户名(哈希表的键)作为属性的单个对象。您需要创建的对象数量由数组中的最大元素数定义。

基本上,您需要将哈希表切割成多个哈希表,其中每个哈希表都包含只有一个字符串值而不是字符串数组的所有键。从本质上讲,你需要改变它:

@{
  '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'}

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

$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

答案 1 :(得分:1)

您可以从哈希表中创建一个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),就像上面的示例一样,您可以使用Select-Object对标题顺序进行排序:

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

在您的示例中,值是集合,并将在csv文件中输出类型名System.Object[]

您可以将值复制到新的哈希表,并在创建对象之前将字符串与-join连接:

$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