使用PowerShell转换嵌套JSON为CSV时生成空文件的问题
PowerShell转换嵌套JSON到CSV生成空文件的解决方法
尝试用PowerShell将嵌套JSON转换为CSV时生成了空文件,以下是示例JSON和使用的脚本:
示例JSON:
{ "reports": [ { "columnHeader": { "dimensions": [ "ga:socialNetwork" ], "metricHeader": { "metricHeaderEntries": [ { "name": "ga:pageviews", "type": "INTEGER" } ] } }, "data": { "rows": [ { "dimensions": [ "(not set)" ], "metrics": [ { "values": [ "433" ] } ] } ], "totals": [ { "values": [ "433" ] } ], "rowCount": 1, "minimums": [ { "values": [ "433" ] } ], "maximums": [ { "values": [ "433" ] } ], "isDataGolden": true } } ] }
使用的PowerShell脚本:
((Get-Content -Path "Z:\Informatica\IICS\ProjectFolders\Dev\Government\Google_Analytics\Files\GA_PageViews_City_2023-07-05.json" -Raw) | ConvertFrom-Json ).results | ConvertTo-Csv -NoTypeInformation | Set-Content Z:\Informatica\IICS\ProjectFolders\Dev\Government\Google_Analytics\Files\GA_PageViews_City_2023-07-05.csv
问题分析与修正
- 顶级键名错误:脚本中使用了
.results,但JSON的顶级数组键是reports,这是导致空文件的直接原因——找不到对应的数据节点。 - 嵌套结构未解析:JSON中的实际数据嵌套在
reports[0].data.rows里,直接转换reports无法提取出结构化的表格数据,需要手动解析维度和指标的对应关系。
正确脚本
# 读取并转换JSON数据 $jsonData = Get-Content -Path "Z:\Informatica\IICS\ProjectFolders\Dev\Government\Google_Analytics\Files\GA_PageViews_City_2023-07-05.json" -Raw | ConvertFrom-Json $report = $jsonData.reports[0] # 提取表头:维度名 + 指标名 $headers = $report.columnHeader.dimensions + $report.columnHeader.metricHeader.metricHeaderEntries.name # 解析每行数据,组合维度和指标值 $rows = $report.data.rows | ForEach-Object { $rowData = [ordered]@{} # 添加维度值 for ($i=0; $i -lt $_.dimensions.Count; $i++) { $rowData[$headers[$i]] = $_.dimensions[$i] } # 添加指标值 for ($i=0; $i -lt $_.metrics[0].values.Count; $i++) { $rowData[$headers[$i + $_.dimensions.Count]] = $_.metrics[0].values[$i] } [PSCustomObject]$rowData } # 转换为CSV并保存 $rows | ConvertTo-Csv -NoTypeInformation | Set-Content "Z:\Informatica\IICS\ProjectFolders\Dev\Government\Google_Analytics\Files\GA_PageViews_City_2023-07-05.csv" -Encoding UTF8
脚本说明
- 先获取JSON中的第一个报告(
reports[0]),因为reports是数组结构。 - 从
columnHeader中提取维度和指标的名称作为CSV表头。 - 遍历
data.rows,将每个行的维度值和指标值对应到表头,生成结构化的自定义对象。 - 最后将对象集合转换为CSV并保存,指定UTF8编码避免乱码问题。
内容的提问来源于stack exchange,提问作者pavan kumar kasaraneni
相关产品推荐
相关产品推荐

