JSON-конвейер Powershell расширяет несколько значений в один столбец csv - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь автоматизировать некоторые конвейеры данных с помощью Powershell, но я застрял с преобразованием списка JSON в одну ячейку на строку в файле CSV.Надеюсь, что некоторые из вас могут помочь мне.

JSON, который я получаю, выглядит следующим образом:

{"result": [
    {
      "uid": "1",
      "EducationHistory": []
    },
    {
      "uid": "2",
      "EducationHistory": []
    },
    {
      "uid": "3",
      "EducationHistory": []
    },
    {
      "uid": "4",
      "EducationHistory": {
        "10466632": {
          "euid": 10466632,
          "degree": "Highschool",
          "educationLevel": null
        },
        "10466634": {
          "euid": 10466634,
          "degree": "Law",
          "educationLevel": "batchelor"
        },
        "10466635": {
          "euid": 10466635,
          "degree": "Law",
          "educationLevel": "master"
        }
      }
    },
    {
      "uid": "5",
      "EducationHistory": {
        "10482462": {
          "euid": 10482462,
          "degree": "IT",
          "educationLevel": "master"
        }
      }
    }
  ]
}

Что я хочу сделать, это собрать educationLevel s в UID в одном столбце,Итак, что-то вроде этого:

uid | educationLevel
----+------------------
1   | 
2   | 
3   |
4   | barchelor, master
5   | master

Обычно я бы хотел, чтобы Expandproperty опустился до более низкого уровня, но в этом случае это не работает, потому что каждая запись EducationHistory стоит за euid для этой конкретной записи.Расширение каждого из них, как в примере ниже, не работает из-за количества записей.

Так что я думаю, что мне нужно что-то вроде петли, но я не знаю как.Надеюсь, ты сможешь мне помочь.Первый пост здесь и новичок в Powershell, так что я надеюсь, что мой вопрос ясен.Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Код для одной записи, например:

$json = Get-content -raw -path C:\TEMP\File.json
   (ConvertFrom-Json -InputObject $json).result  |
   Select-Object uid, 

    #Expand one of the entries:
    @{Name = "Edu.Level";E={$_.EducationHistory | Select-Object - 
    expandproperty 10466632 |Select-Object -expandpropert degree }}   | 
    Format-Table

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Ваш первый вопрос, мой первый ответ, я верю :) Похоже на последний ответ.Вам нужно прыгнуть через круг поиска имен объектов в EducationalHistory, чтобы ссылаться на них.

$json = (Get-content C:\TEMP\File.json | ConvertFrom-Json).result

$results = @()
foreach ( $u in $json)
{
    foreach ( $h in $u.EducationHistory)
    {
        $results += $h.PSObject.properties.Name | ForEach-Object{new-object PSObject -property @{ uid=$u.uid; degree=$h.$_.degree}}
    }
}

$results | ConvertTo-Csv | select -skip 1
0 голосов
/ 25 октября 2018
$content = Get-Content .\test.json
$result = ($content | ConvertFrom-Json).result

$totalResult = @()

foreach($res in $result) {

    $tempArray = @()

    if($res.EducationHistory -ne $null) {
        $properties = $res.EducationHistory | Get-Member -MemberType NoteProperty
        foreach($property in $properties) {

            $eduLevel = $res.EducationHistory.$($property.Name).educationLevel

            if(![String]::IsNullOrEmpty($eduLevel)) {
                $tempArray += $eduLevel
            }
        }
    }

    $totalResult += [PSCustomObject]@{
        uid = $res.uid
        educationLevel = $tempArray -join ", "
    }

}

$totalResult

Это выведет желаемый результат для введенного вами ввода.Самая хитрая часть - это значение свойства EducationHistory.Вы должны использовать командлет Get-Member (см. Get-Help Get-Member), чтобы получить свойства текущего объекта в цикле.Затем, используя имя свойства для доступа к educationLevel.

...