我正在使用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]
。
答案 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-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