csvkit in2csv - как преобразовать один объект json в csv с двумя столбцами - PullRequest
2 голосов
/ 08 марта 2019

Ищем один вкладыш с csvkit.

Из простого объекта json

{
  "whatever": 2342,
  "otherwise": 119,
  "and": 1,
  "so": 2,
  "on": 3
}

Хочу этот csv

whatever,2342
otherwise,119
and,1
so,2
on,3

Я в основном хочу, чтобы эта команда работала, но это не так.

echo $the_json | in2csv -f json
> When converting a JSON document with a top-level dictionary element, a key must be specified.

Похоже, что csvkit может сделать, и я просто не нашел правильных вариантов.

1 Ответ

2 голосов
/ 12 марта 2019

короткий ответ

вариант A: in2csv (csvkit) + csvtool

  • заключите ваш json в скобки
  • используйте опцию in2csv -I, чтобы избежать непредвиденного поведения
  • используйте команду для транспонирования двухстрочного CSV, например csvtool
echo "[$the_json]" | in2csv -I -f json | csvtool transpose -

вариант B: используйте jq вместо

Это решение с использованием только jq: (https://stedolan.github.io/jq/)

echo "$the_json" | jq -r 'to_entries[] | [.key, .value] | @csv'

взято из Как сопоставить объект массивам, чтобы его можно было преобразовать в csv?


длинный ответ (csvkit + csvtool)

вход

in2csv -f json ожидает список объектов JSON, поэтому вам нужно заключить один объект ({...}) в квадратные скобки ([{...}]).

На POSIX-совместимыхshells, напишите

echo "[$the_json]"

, которая напечатает

[{
  "whatever": 2342,
  "otherwise": 119,
  "and": 1,
  "so": 2,
  "on": 3
}]

команду csvkit

Вы можете передать вышеприведенные данные непосредственно в in2csv. Однако вы можете запуститьв проблемы с « выводом типа » (данные CSVrpretation) функция csvkit:

<b>$ echo "[$the_json]" | in2csv -f json</b>
whatever,otherwise,and,so,on
2342,119,True,2,3

1 стала True.Для получения дополнительной информации см. Часть Советы и устранение неисправностей .Рекомендуется отключить вывод типа с помощью опции -I:

<b>$ echo "[$the_json]" | in2csv -I -f json</b>
whatever,otherwise,and,so,on
2342,119,1,2,3

Теперь результат, как и ожидалось

транспонировать данные

Тем не менее, вам нужно транспонировать данные.Документация csvkit скажем :

Для транспонирования CSV рассмотрим csvtool .

(csvtool доступно на github , opam , debian и, возможно, другие каналы распространения.)

Используя csvkit + csvtool, ваша последняя команда выглядит следующим образом:

echo "[$the_json]" | in2csv -I -f json | csvtool transpose -

с дефисом (-), означающим получение данных из stdin.Вот результат:

whatever,2342
otherwise,119
and,1
so,2
on,3

вот и все.

Я думаю, что нет единого решения с только csvtool, вам понадобится in2csv.Однако вместо этого вы можете использовать jq, см. Краткий ответ.

FTR, я использую версию csvkit 1.0.3 .

...