簡體   English   中英

將Powershell數組分組,然后轉換為json

[英]Group Powershell array then convert to json

我已經瀏覽了多個線程,但是無法找到解決我問題的方法。 基本上我有一個看起來像這樣的數組: 陣列樣本

我最終試圖按狀態對它進行分組,然后將其轉換為json並輸出如下:

{
  "NY": [
    "auto",
    "food"
  ],
  "CA": [
    "retail",
    "health",
    "auto"
  ],
  "TX": [
    "retail",
    "insurance"
  ]
}

我對如何完成此工作有些困惑,似乎無法將其轉換為我想要的格式。 任何幫助將不勝感激。 謝謝!

您需要構建一個與您要輸出的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}

在這一點上,我打算中止課程並為您留下一些編碼,
但是colsw好的答案可以使您免於遭受損失

這是使用命令行工具的解決方案。 為簡化起見,我們假設以下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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM