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

В конечном итоге я пытаюсь сгруппировать это по состоянию, а затем преобразовать его в 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. Для упрощения предположим, что следующий скрипт 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.
Добро пожаловать в SO как новый пользователь. Пожалуйста, возьмите тур и прочтите также Как спросить. Переполнение стека не является бесплатным сервисом для написания скриптов. Ожидаются собственные исследования и попытки написания кода.