[英]Group Powershell array then convert to json
您需要構建一個與您要輸出的JSON格式完全相同的對象,在您的特定情況下,最簡單的方法可能是:
$Data = @(
[PSCustomObject]@{State="NY";Type="auto"}
[PSCustomObject]@{State="NY";Type="food"}
[PSCustomObject]@{State="CA";Type="retail"}
[PSCustomObject]@{State="CA";Type="health"}
[PSCustomObject]@{State="CA";Type="auto"}
[PSCustomObject]@{State="TX";Type="retail"}
[PSCustomObject]@{State="TX";Type="insurance"}
)
$Obj = @{}
foreach ($Group in ($Data | Group State)) {
$Obj[$Group.Name] = ($Group.Group | Select -Expand Type)
}
$Obj | ConvertTo-Json
它將確切輸出:
{
"TX": [
"retail",
"insurance"
],
"NY": [
"auto",
"food"
],
"CA": [
"retail",
"health",
"auto"
]
}
格式化的方式會根據輸入和輸出格式的不同而有很大差異,但是希望這也可以幫助您了解類似問題。
您不顯示任何代碼,因此假設您的數據源自csv文件
> import-csv .\data.csv
State Type
----- ----
NY auto
NY food
CA retail
CA health
CA auto
TX retail
TX insurance
按狀態分組會產生以下結果:
Import-Csv .\data.csv | Group-Object state
Count Name Group
----- ---- -----
2 NY {@{State=NY; Type=auto}, @{State=NY; Type=food}}
3 CA {@{State=CA; Type=retail}, @{State=CA; Type=health}, @{State=CA; Type=auto}}
2 TX {@{State=TX; Type=retail}, @{State=TX; Type=insurance}}
但是您只需要一次狀態和每個組中的類型,
因此,嘗試展開數組和ConvertTo-Json:
> Import-Csv .\data.csv|Group-Object state|ForEach{@{$_.Name = $_.Group.Type}}|ConvertTo-Json
[
{
"NY": [
"auto",
"food"
]
},
{
"CA": [
"retail",
"health",
"auto"
]
},
{
"TX": [
"retail",
"insurance"
]
}
]
看起來很相似,但不是所希望的。
嘗試查看以其他方式轉換時的對象外觀:
@"
{
"NY": [
"auto",
"food"
],
"CA": [
"retail",
"health",
"auto"
],
"TX": [
"retail",
"insurance"
]
}
"@ | ConvertFrom-Json
NY CA TX
-- -- --
{auto, food} {retail, health, auto} {retail, insurance}
這是使用命令行工具jq的解決方案。 為簡化起見,我們假設以下jq腳本位於名為program.jq的文件中,並且文件States.csv包含狀態/類型表作為CSV文件:
[inputs | sub(",";"\t") | split("\t") | {state: .[0], type: .[1]}]
| group_by(.state)
| map({ (.[0]|.state) : map(.type)})
| add
這會將每行中的第一個“,”更改為一個選項卡,然后拆分該行,形成一個對象,等等。
如果states.csv具有標題行:
jq -nR -f program.jq states.csv
否則,只需使用-R而不是-nR。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.