【问题标题】:Export hashtable to CSV with the key as the column heading以键为列标题将哈希表导出为 CSV
【发布时间】:2015-10-06 13:28:21
【问题描述】:

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

这是它的样子:

名称值
---- -----
user1 {域用户,组 2,组 3}
user2 {域用户,组 4}
user3 {域用户,组2,组3,组4}

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

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

 A B C
  ------------------------------------------
1 |用户 1 用户 2 用户 3
2 |域用户 域用户 域用户
3 |组 2 组 4 组 2
4 |组 3 组 3
5 |组4

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

【问题讨论】:

  • 另存为 CSV,在 Excel 中打开,使用 'Transpose paste' button 将行/列交换为您想要的形式。保存。

标签: excel csv powershell


【解决方案1】:

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

基本上,您需要将哈希表拆分为多个哈希表,其中每个哈希表的所有键都只有一个字符串值,而不是字符串数组。本质上,您需要对其进行转换:

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

【讨论】:

    【解决方案2】:

    您可以从哈希表创建一个 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
    

    【讨论】:

    • 此脚本已关闭...谢谢!它将用户名放在第一行,然后将逗号分隔的组列表放在第二行。 excel 文档只有 2 行数据。我希望每个组都显示在新行上。我会四处摆弄,看看我能想出什么。
    • 你有没有想过这个@Neil Hoff
    • @david 我不得不转移到其他项目,所以我无法完全实施。
    猜你喜欢
    • 2019-02-04
    • 2022-01-15
    • 1970-01-01
    • 2018-01-22
    • 2011-07-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    相关资源
    最近更新 更多