Транспонировать значения столбцов индекса массива JSON в строки и экспортировать в CSV - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть файл JSON в формате ниже:

[
        {
            "id":  "12345",
            "name": "test_group",
            "members":  
                [
                    {
                        "id":  "11111",
                        "name": "test_member_1"
                    },
                    {
                        "id":  "22222",
                        "name": "test_member_2"
                    },
                    {
                        "id":  "33333",
                        "name": "test_member_3"
                    }
                ]
        }
]

Мое требование - преобразовать их в формат ниже / вывод в CSV:

groupId,groupName,memberId,memberName
12345,test_group,11111,test_member_1
12345,test_group,22222,test_member_2
12345,test_group,33333,test_member_3

Я могу получитьЗначения индекса массива в виде объединенных строк в одном столбце с использованием приведенного ниже кода, но требуется вывод только в указанном формате:

$jsonfile = 'C:\newjsonfile.json'
$outputcsv = 'C:\newcsvfile.csv'
$fields=@(
     @{Name='groupId';Expression={$_.id}}
    ,@{Name='groupName';Expression={$_.name}}
    ,@{Name='memberId';Expression={$_.members.id, -join '|~|'}}
    ,@{Name='memberName';Expression={$_.members.name -join '|~|'}}
)
(Get-Content $jsonfile -Raw | ConvertFrom-Json) |
    Select-Object -Property $fields |
    Export-Csv $outputcsv -NoTypeInformation -Force

CSV Выход из вышеприведенного запроса:

groupId, groupName,  memberId,              memberName                                   
----- ---------  --------              ----------                                   
12345, test_group, {11111 |~| 22222 |~| 33333}, {test_member_1 |~| test_member_2 |~| test_member_3}

Пожалуйста, помогите / предложитев решении этого запроса в PowerShell.Текущая версия:

PS C:\WINDOWS\system32> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  407   

1 Ответ

0 голосов
/ 29 ноября 2018

Вы хотите объединить информацию из родительского объекта с информацией из вложенных дочерних объектов.Для этого вам нужно сохранить информацию от родителя в переменных, а затем внедрить ее при обработке дочерних объектов:

(Get-Content $jsonfile -Raw | ConvertFrom-Json) | ForEach-Object {
    $gid  = $_.id
    $name = $_.name
    $_.members |
        Select-Object @{n='groupId';e={$gid}},
            @{n='groupName';e={$name}},
            @{n='memberId';e={$_.id}},
            @{n='memberName';e={$_.name}}
} | Export-Csv $outputcsv -NoType -Force
...