我有一个JSON文件,看起来像这样:
{
"id": 10011,
"title": "Test procedure",
"slug": "slug",
"url": "http://test.test",
"email": "[email protected]",
"link": "http://test.er",
"subject": "testing",
"level": 1,
"disciplines": [
"discipline_a",
"discipline_b",
"discipline_c"
],
"areas": [
"area_a",
"area_b"
]
},
我尝试使用以下命令将其转换为CSV文件:
(Get-Content "PATH_TO\test.json" -Raw | ConvertFrom-Json)| Convertto-CSV -NoTypeInformation | Set-Content "PATH_TO\test.csv"
然而,对于学科和领域,我在生成的CSV文件中获得System.Object[]。
有没有办法把所有这些嵌套的值作为一个单独的列在CSV文件中,如area_1,area_2等。纪律也是如此。
2条答案
按热度按时间rt4zxlrg1#
2017-11-20,完全重写函数以提高性能,并添加
-ArrayBase
功能,支持PSStandardMembers和分组对象。Flatten-Object
递归地解析包含数组、哈希表和(自定义)对象的对象。提供的objects will be aligned的所有添加属性以及其余对象。
需要PowerShell版本2或更高版本。
Cmdlet
语法
或:
参数设置
-Object[] <Object[]>
要展平的对象(或多个对象)。
-Separator <String>
(默认:.
)递归属性名称之间使用的分隔符。.
-Depth <Int>
(默认:5
)递归属性的最大扁平化深度.任何负值都将导致无限的深度,并可能导致无限循环。
-Uncut <Int>
(默认:1
)object 迭代的次数将被限制为
DefaultDisplayPropertySet
。任何负值都将显示所有对象的所有属性。-Base "" | 0 | 1
(默认:1
)嵌入数组的第一个索引名称:
1
,阵列将基于1:<Parent>.1
,<Parent>.2
,<Parent>.3
,.0
,数组将以0为基数:<Parent>.0
,<Parent>.1
,<Parent>.2
,.""
,数组中的第一个元素将是未命名的,然后后跟1:<Parent>
,<Parent>.1
,<Parent>.2
,.-ToString <Type[]= [String], [DateTime], [TimeSpan]>
值类型列表(默认值为
[String], [DateTime], [TimeSpan]
),将被转换为字符串,而不是进一步扁平化。例如,[DateTime]
可以被平坦化,具有附加属性,如Date
,Day
,DayOfWeek
等。但是将被转换为单个(String
)属性。参数**
-Path
**供内部使用,但可以用作属性名称的前缀。示例
回答具体问题:
测试结果:
对更复杂的自定义对象进行压力测试:
测试结果:
展平编组对象:
$csv | Group Name | Flatten | Format-Table
# https://stackoverflow.com/a/47409634/1701026
展平常用对象:
(Get-Process)[0] | Flatten-Object
或者是一个对象列表(数组):
Get-Service | Flatten-Object -Depth 3 | Export-CSV Service.csv
请注意,下面的命令需要几个小时来计算:
Get-Process | Flatten-Object | Export-CSV Process.csv
Where-Object
小窗口)或列数(使用Select-Object
小窗口)。gk7wooem2#
CSV转换/导出cmdlet无法“扁平化”对象,我可能遗漏了一些东西,但我不知道如何使用内置的cmdlet或功能来实现这一点。如果你可以保证
disciplines
和areas
总是有相同数量的元素,你可以通过使用Select-Object
和派生属性来实现这一点:但是,我假设
disciplines
和areas
对于每条记录都是可变长度的。在这种情况下,您将不得不循环输入并为规程和区域提取最高计数值,然后动态构建属性数组:这段代码还没有完全测试过,所以它可能需要一些调整才能100%工作,但我相信这些想法是可靠的=)