У меня есть файл JSON ниже:
{
"data": [
{
"displayName": "First Name",
"rank": 1,
"value": "VALUE"
},
{
"displayName": "Last Name",
"rank": 2,
"value": "VALUE"
},
{
"displayName": "Position",
"rank": 3,
"value": "VALUE"
},
{
"displayName": "Company Name",
"rank": 4,
"value": "VALUE"
},
{
"displayName": "Country",
"rank": 5,
"value": "VALUE"
},
]
}
Я хотел бы иметь файл CSV в этом формате:
First Name, Last Name, Position, Company Name, Country
VALUE, VALUE, VALUE, VALUE, VALUE, VALUE
Это возможно только при использовании jq
? У меня нет никаких навыков программирования.
Ответы:
У jq есть фильтр @csv для преобразования массива в строку CSV. Этот фильтр учитывает большинство сложностей, связанных с форматом CSV, начиная с запятых, встроенных в поля. (jq 1.5 имеет аналогичный фильтр @tsv для генерации файлов с разделенными табуляцией значениями.)
Конечно, если заголовки и значения гарантированно не содержат запятых и двойных кавычек, тогда может не потребоваться использование фильтра @csv. В противном случае, вероятно, было бы лучше использовать его.
Например, если «Название компании» было «Смит, Смит и Смит», и если другие значения были такими, как показано ниже, то при вызове jq с параметром «-r» будет получен действительный CSV:
источник
Я предпочитаю делать каждую запись строкой в моем CSV.
источник
.value|tostring
того, что было.value
в приведенном выше примере(.value|tostring)
jq -r
чтобы раздеть цитатыУчитывая только этот файл, вы можете сделать что-то вроде:
.
Оператор выбирает поле из объекта / хэша. Итак, начнем с того.data
, что возвращает массив с данными в нем. Затем мы дважды отображаем массив, сначала выбираем displayName, затем выбираем значение, давая нам два массива только со значениями этих ключей. Для каждого массива мы соединяем элементы с помощью «,», образуя две строки.-r
Аргумент говоритjq
не процитировать получившиеся строки.Если ваш фактический файл длиннее (то есть содержит записи для более чем одного человека), вам, вероятно, понадобится что-то более сложное.
источник
Мне было
jq
трудно обернуть голову. Вот немного Ruby:Рубиновый JSON-анализатор перебрал запятую перед закрывающей скобкой.
источник
Поскольку вы отметили это
python
и предполагаете, что имяjson
файлаx.json
источник
Хотя мне пришлось удалить последнюю запятую в вашем примере ввода, чтобы она заработала, потому что
jq
жаловалась на ожидание другого элемента массива, это:...подловил...
Как это работает в двух словах:
[]
форму поля индекса и.dot
обозначения..[][].displayName
.[.[][].displayName], [.[][].value]
join(", ")
функцию для объединения в виде отдельных объектов.По правде говоря,
[.field]
это просто другой способ,map(.field)
но он немного более специфичен, так как определяет уровень глубины для извлечения желаемых данных.источник