Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在powershell中将嵌套哈希表导出为csv_Powershell_Csv_Nested_Export_Hashtable - Fatal编程技术网

在powershell中将嵌套哈希表导出为csv

在powershell中将嵌套哈希表导出为csv,powershell,csv,nested,export,hashtable,Powershell,Csv,Nested,Export,Hashtable,我有一个数组,其中嵌套了一个包含数据的哈希表: tid : 1 token : 12345 participant_info : @{firstname=bob; lastname=smith; email=bob.smith@email.com} completed : y tid : 2 token : 67890 participant_info : @{firstname=Al

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

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对象,但是因为我的嵌套项没有命名,所以我无法使用本文中的其他示例来解决这个问题

感谢您的帮助!谢谢

根据您的样本:

@(
    [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
,因此我前面的语法对此不起作用。下面是我现在假设您的代码的样子(我已经更新了上面的示例):


向我们展示您迄今为止所做的尝试,并解释它如何对您无效。这不是一个有效的哈希表。。您没有任何键,只有值。您的外部哈希似乎没有键值对?此外,这些数据是如何生成的?如果你控制住了这一点,我会说你最好的办法是从一开始就把它放在一个更好的数据结构中。你的哈希表也有一个开头
@(
),但没有相应的结尾
。数据来自Limesurvey的远程控制API,使用列表参与者方法。我使用ConvertFrom JSON转换接收到的JSON。我刚刚注意到,返回的类型实际上是一个数组,其中确实包含内部哈希表-我想我需要删除这一个并再次询问!:-)@DavidPhillips使用
$Json |格式列表-属性*
outputHanks更新您的问题,以了解您在这方面花费的时间。看起来确实有点奇怪,因为您给出的代码没有输出我所期望的答案。如果我只是在shell中键入变量,就会得到一个
1123456@{firstname=bob;姓氏=smith;email=bob的表。smith@email.com}Y
如果我对$sample中的每个$item执行
操作,然后
写入主机($item[0])
,我得到
@{id=1;token=12345;participant_info=;completed=N}
。无论我尝试什么,我都无法从这里返回内部值-例如
$sample[0]['id']
谢谢!但这不会返回每个属性的数据-CSV显示多行,但没有数据
$jsonlist.tid
列出所有tid,并且
$jsonlist.tid.getvalue(0)
返回正确的值,但我无法使用方括号表示法返回任何内容。@DavidPhillips检查我的编辑。我已经更新了你的用例。轰!完美-非常感谢您的帮助,并坚持我的措辞糟糕的问题。我保留了hashtables的另一个版本,以防将来遇到。我认为任何带有{}括号而不是()的东西都是哈希表。
@"
[
    {
        "tid": 1,
        "token": 12345,
        "participant_info": {
            "firstname": "bob",
            "lastname": "smith",
            "email": "bob.smith@email.com"
        },
        "completed": "N"
    }

    ...
]
"@ | ConvertFrom-Json