Разберите вывод JSON в файл CSV с помощью Powershell - PullRequest
0 голосов
/ 27 мая 2020

Я использую PowerShell для извлечения данных через API и хочу преобразовать JSON в файл CSV. Как мне разобрать каждый из результатов JSON в структуру CSV следующим образом:

$Date, $app, $pagename, $range1, $range1_value
$Date, $app, $pagename, $range2, $range2_value
$Date, $app, $pagename, $range3, $range3_value

JSON выглядит так:

{
"fields":  [
               {
                   "label":  "app",
                   "field":  "app",
                   "type":  "string"
               },
               {
                   "label":  "pagename",
                   "field":  "pagename",
                   "type":  "string"
               },
               {
                   "label":  "range1",
                   "field":  "count(*)",
                   "type":  "integer",
                   "aggregation":  "filter"
               },
               {
                   "label":  "range2",
                   "field":  "count(*)",
                   "type":  "integer",
                   "aggregation":  "filter"
               },
               {
                   "label":  "range3",
                   "field":  "count(*)",
                   "type":  "integer",
                   "aggregation":  "filter"
               }
           ],
"results":  [
                [
                    "application1",
                    "loginpage",
                    41425,
                    41266,
                    18869
                ],
                [
                    "application2",
                    "loginpage",
                    7424,
                    7113,
                    2905
                ]
            ],
"moreData":  false,
"schema":  "record"
}

Я пробовал разные методы (например, Convertto-JSON и Convertfrom-JSON), но мне кажется, что я не могу объединить «поля» и «результаты» в хеш-таблицу. Я надеялся, что смогу создать его как объект $JSON, а затем перебирать каждый результат, например $JSON[0..1].

1 Ответ

1 голос
/ 27 мая 2020

Давайте начнем с анализа ваших входных данных!

Используйте for l oop, чтобы перебирать отдельные элементы массива в значениях results, затем используйте индекс для определения типа и метки имя из списка fields:

# Convert from json
$data = $jsonString |ConvertFrom-Json

# Set up a type table for easy conversion
$typeTable = @{'integer' = [int]}

# Iterate over each row in the results
$results = foreach($values in $data.results){

  # Create dictionary to hold property values for the row
  $Properties = [ordered]@{}
  for($index = 0; $index -lt $data.fields.Count; $index++){
    # Resolve field metadata by index
    $field = $data.fields[$index]

    # Take type mappings into account and write to $Properties dictionary
    if($typeTable.ContainsKey($field.type)){
      $Properties[$field.label] = $values[$index] -as $typeTable[$field.type]
    }
    else{
      $Properties[$field.label] = $values[$index]
    }
  }

  # Output structured object
  [PSCustomObject]$Properties
}

Теперь, когда у нас есть хорошие объекты, с которыми мы можем работать, мы можем использовать Select-Object и Export-Csv для создания желаемого формата вывода:

$results |Select-Object @{Name='Date';Expression={Get-Date -Format yyyyMMdd}},app,pagename,@{Name='2000';Expression={'2000'}},range3 |Export-Csv -Path .\path\to\output.csv -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...