Группа Powershell массив затем преобразовать в JSON - PullRequest
0 голосов
/ 27 октября 2018

Я просмотрел несколько тем, но не смог найти решение своей проблемы.По сути, у меня есть массив, который выглядит так: array sample

В конечном итоге я пытаюсь сгруппировать это по состоянию, а затем преобразовать его в json с выводом, таким образом:

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

Я застрял здесь на том, как это сделать, и, похоже, не могу получить его в том формате, который я ищу.Любая помощь будет принята с благодарностью.Спасибо!

Ответы [ 3 ]

0 голосов
/ 27 октября 2018

Вы не показываете никакого кода, поэтому давайте предположим, что ваши данные происходят из 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 хороший ответ избавляет вас от этого.

0 голосов
/ 28 октября 2018

Вот решение с использованием инструмента командной строки .Для упрощения предположим, что следующий скрипт 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.

0 голосов
/ 27 октября 2018

Вам нужно создать объект, который имеет тот же формат, что и 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"
           ]
}

Способ форматирования будет сильно различаться в зависимости от ваших форматов ввода и вывода, но, надеюсь, это поможет вам понять и аналогичные проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...