将CSV数据的JSON表示转换为实际的CSV数据



这个自答问题是关于将CSV数据的JSON表示转换为实际的CSV数据的。[1]

以下JSON包含单独的属性,分别描述标题(列名)(columns)和相应的行值(rows)的数组:

{
"columns": [
{
"name": "ColumnName1",
"type": "Number"
},
{
"name": "ColumnName2",
"type": "String"
},
{
"name": "ColumnName3",
"type": "String"
}
],
"rows":    [
[
11111,
"ResourceType1",
"String1"
],
[
22222,
"ResourceType2",
"String2"
],
[
33333,
"ResourceType3",
"String3"
]
]
}

我如何将这个JSON输入转换为它所代表的CSV数据?


[1]这个问题重复了这个封闭问题,这个封闭问题可能是由于缺乏努力而关闭的,即使它要求的是合理定义的

注意CSV文件没有数据类型的概念-所有值都是字符串,因此数据类型信息(来自.column.type属性)丢失,除非您选择合并它以某种方式作为约定, CSV的消费者必须知道(下面的代码没有这样做)。

假设问题中的JSON保存在文件file.json中,通过使用Get-Content:读取文件作为文本,可以使用ConvertFrom-Json将其解析为([pscustomobject])对象图。

# Convert the JSON text into a [pscustomobject] object graph.
$fromJson = ConvertFrom-Json (Get-Content -Raw file.json)
# Process the array of column names and the arrays of row values by
# enclosing the array elements in "..." and joining them with ","
(, $fromJson.Columns.Name + $fromJson.Rows).ForEach({
$_.ForEach({ '"{0}"' -f ($_ -replace '"', '""') }) -join ','
})

请注意,上面包含了"..."中的列名和值,以便也支持内嵌,字符的名称和值;此外,任何嵌入的"字符都通过加倍来正确转义。

如果您知道输入数据既不包含嵌入,的值,也不包含",您可以简单地省略内部.ForEach()数组方法调用上面的代码,这将导致未加引号的值。

以上输出:

"ColumnName1","ColumnName2","ColumnName3"
"11111","ResourceType1","String1"
"22222","ResourceType2","String2"
"33333","ResourceType3","String3"
  • 要将上述内存中的转换为表示CSV数据的([pscustomobject])对象,请使用ConvertFrom-Csv(...表示上述命令):

    ... | ConvertFrom-Csv
    
  • 要将上述内容保存为CSV文件,请使用Set-Content:

    ... | Set-Content -Encoding utf8 out.csv
    

最新更新