【问题标题】:Export nested hash table to csv in powershell在powershell中将嵌套哈希表导出到csv
【发布时间】:2018-09-16 14:29:39
【问题描述】:

我有一个数组,其中包含一个包含数据的嵌套哈希表:

tid              : 1
token            : 12345
participant_info : @{firstname=bob; lastname=smith; email=bob.smith@email.com}
completed        : y

tid              : 2
token            : 67890
participant_info : @{firstname=Alice; lastname=Jones; email=alice.jones@email.com}
completed        : n

我想将其输出为 CSV,其中嵌套的名字、姓氏和电子邮件项从内部哈希表中提取出来 - 例如

tid,token,firstname,surname,email,completed
1,12345,bob,smith,bob.smith@email.com,y
2,67890,alice,jones,alice.jones@email.com,n

我猜答案是使用 foreach 循环并创建一个自定义 ps 对象,但是因为我的嵌套项没有命名,所以我无法使用此处的其他示例来解决此问题.

感谢任何帮助!谢谢!

【问题讨论】:

  • 向我们展示您到目前为止所尝试的方法,并解释它对您的效果如何。
  • 这不是一个有效的哈希表。你没有任何键,只有值。
  • 您的外部哈希似乎没有键值对?另外,这些数据是如何产生的?如果您控制它,我会说您最好的选择是从一开始就将其放入更好的数据结构中。
  • 您的哈希表也有一个开头@(,但没有相应的结尾)
  • 数据来自 Limesurvey 的远程控制 API,使用 list_participants 方法。我使用 ConvertFrom-Json 转换收到的 JSON。我刚刚注意到返回的类型实际上是一个数组,其中确实包括内部哈希表 - 我想我需要删除这个并再次询问! :-)

标签: powershell csv nested export hashtable


【解决方案1】:

鉴于您的样本:

@(
    [pscustomobject]@{
        tid = 1
        token = 12345
        participant_info = @{
            firstname = 'bob'
            lastname = 'smith'
            email = 'bob.smith@email.com'
        }
        completed = 'N'
    }

    ...
)

以及想要的输出:

id,token,firstname,surname,email,completed
1,12345,bob,smith,bob.smith@email.com,y
2,67890,alice,jones,alice.jones@email.com,n

你可以这样做:

$JsonList = @( ... )
$Path = "$Env:UserProfile\file.csv"

ForEach ($Sample in $JsonList)
{
    $Sample | Select-Object -Property @(
        @{N = 'id';        E = { $Sample.tid }}
        @{N = 'token';     E = { $Sample.token }}
        @{N = 'firstname'; E = { $Sample.participant_info.firstname }}
        @{N = 'surname';   E = { $Sample.participant_info.lastname }}
        @{N = 'email';     E = { $Sample.participant_info.email }}
        @{N = 'completed'; E = { $Sample.completed }}
    ) | Export-Csv -Path $Path -Append
}

编辑:你处理的是PSCustomObject,而不是Hashtable,所以我以前的语法不适用于那个。这是我假设您的代码现在的样子(我已经更新了上面的示例):

@"
[
    {
        "tid": 1,
        "token": 12345,
        "participant_info": {
            "firstname": "bob",
            "lastname": "smith",
            "email": "bob.smith@email.com"
        },
        "completed": "N"
    }

    ...
]
"@ | ConvertFrom-Json

【讨论】:

  • @DavidPhillips 使用$Json | Format-List -Property * 输出更新您的问题
  • 感谢您花在这方面的时间。看起来确实有些奇怪,因为您给出的代码没有输出我期望的答案。如果我只是在 shell 中输入变量,我会得到一个1 123456 @{firstname=bob;surname=smith;email=bob.smith@email.com} Y 的表如果我执行foreach $item in $sample,然后是write-host ($item[0]),我会得到@{id=1;token=12345;participant_info=;completed=N}。无论我尝试什么,我都无法从这里返回内部值 - 例如$sample[0]['id']
  • 谢谢!但这不会为每个属性返回数据 - CSV 显示多行,但没有数据。 $jsonlist.tid 列出所有 tid,$jsonlist.tid.getvalue(0) 返回正确的值,但我无法使用方括号表示法返回任何内容。
  • @DavidPhillips 检查我的编辑。我已更新到您的用例。
  • 轰隆隆!完美 - 非常感谢您帮助并解决我措辞不好的问题。我为哈希表保留了另一个版本,以防我将来遇到这些。我认为任何带有 {} 括号而不是 () 的东西都是哈希表。
猜你喜欢
  • 2017-12-14
  • 2018-01-22
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多