将Powershell数组分组,然后转换为json

时间:2018-10-27 14:11:28

标签: arrays json powershell

我已经浏览了多个线程,但是无法找到解决我问题的方法。基本上我有一个看起来像这样的数组: array sample

我最终试图按状态对它进行分组,然后将其转换为json并显示如下输出:

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

我对如何完成此工作有些困惑,似乎无法将其转换为我想要的格式。任何帮助将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:2)

您需要构建一个与您要输出的JSON格式完全相同的对象,在您的特定情况下,最简单的方法可能是:

second_val

将准确输出:

$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

格式化的方式会根据输入和输出格式的不同而有很大差异,但是希望这也可以帮助您了解类似问题。

答案 1 :(得分:1)

您没有显示任何代码,因此我们假设您的数据来自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好的答案可以帮助您摆脱困境。

答案 2 :(得分:0)

这是使用命令行工具的解决方案。为简化起见,我们假设以下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。