使用Powershell将JSON输出解析为CSV文件

时间:2020-05-27 15:50:10

标签: powershell

我正在使用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-JSONConvertfrom-JSON),但似乎无法将“字段”和“结果”连接到哈希表中。我希望可以将其创建为$JSON对象,然后遍历每个结果,例如$JSON[0..1]

1 个答案:

答案 0 :(得分:1)

让我们首先解析您的输入数据!

使用for循环遍历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-ObjectExport-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