Мне нужно создать отчет csv
из файла JSON
следующей структуры (упрощено настолько, насколько я посчитал нужным):
{
"data": [
{
"id": "123",
"foo": {
"item": {
"value": "foo_good",
"bar_id": "1"
}
},
"bar": {
"item": {
"id": "1",
"value": "bar_value_1a"
}
},
"var": {
"item": {
"value": "var_value_1a",
"bar_id": "1"
}
}
},
{
"id": "456",
"foo": {
"item": [
{
"value": "foo_bad",
"bar_id": "1"
},
{
"value": "foo_good",
"bar_id": "2"
},
{
"value": "foo_good",
"bar_id": "2"
},
{
"value": "foo_bad",
"bar_id": "3"
},
{
"value": "foo_good",
"bar_id": "4"
}
]
},
"bar": {
"item": [
{
"id": "1",
"value": "bar_value_2a"
},
{
"id": "2",
"value": "bar_value_2b"
},
{
"id": "3",
"value": "bar_value_2c"
},
{
"id": "4",
"value": "bar_value_2d"
}
]
},
"var": {
"item": [
{
"value": "var_value_2a",
"bar_id": "1"
},
{
"value": "var_value_2b",
"bar_id": "2"
},
{
"value": "var_value_2c",
"bar_id": "3"
},
{
"value": "var_value_2d",
"bar_id": "4"
}
]
}
}
]
}
Структура данных:
foo.item
и var.item
подключены к bar.item
с bar_id
- Один или несколько
foo.item
указывают на один bar.item
- Несколько
foo.item
, указывающие на одно и то же bar.item
, будут иметь одинаковые foo.item.value
- Ровно один
var.item
указывает на один bar.item
- Все товары отсортированы по
bar_id
- Формат несовместим .
bar.item
- это объект, если есть только один элемент, в противном случае это массив (также относится к foo.item
и var.item
)
- Я застрял в этом формате
Выходной отчет:
- Обработка всех
data
объектов
- Создать отчет для каждого
bar.item
, который не имеет соответствующий foo.item
со значением foo_bad
- Выходной формат:
.id, .bar.item.value, .var.item.value
Моя попытка:
Временный сценарий jq
, который я сейчас использую, отбрасывает несколько bar.item
и т. Д. И создает простую оценку реальных данных:
.data[]
| .foo.item |= if type=="array" then .[0] else . end
| .bar.item |= if type=="array" then .[0] else . end
| .var.item |= if type=="array" then .[0] else . end
| select(.foo.item.value != "foo_bad")
| [.id,.bar.item.value,.var.item.value]
| @csv
Что выводит следующее:
"123","bar_value_1a","var_value_1a"
Желаемый выход:
"123","bar_value_1a","var_value_1a"
"456","bar_value_2b","var_value_2b"
"456","bar_value_2d","var_value_2d"
Я предпочитаю использовать jq
, хотя я не настаиваю на этом.