Использование jq для извлечения значений и форматирования в CSV

У меня есть следующий файл 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 ? У меня нет навыков программирования.

6 Solutions collect form web for “Использование jq для извлечения значений и форматирования в CSV”

Учитывая только этот файл, вы можете сделать что-то вроде:

 <testfile jq -r '.data | map(.displayName), map(.value) | join(", ")' 

. оператор выбирает поле из объекта / хеша. Таким образом, мы начинаем с .data , который возвращает массив с данными в нем. Затем мы дважды перебираем массив, сначала выбираем displayName, а затем выбираем значение, предоставляя нам два массива с только значениями этих ключей. Для каждого массива мы соединяем элементы с «,», образуя две строки. Аргумент -r указывает jq чтобы не приводить приведенные строки.

Если ваш фактический файл длиннее (т. Е. Имеет записи для более чем одного человека), вам, вероятно, потребуется что-то более сложное.

Я предпочитаю делать каждую запись строки в моем CSV.

 jq '.data | map([.displayName, .rank, .value] | join(", ")) | join("\n")' 

jq имеет фильтр @csv для преобразования массива в строку CSV. Этот фильтр учитывает большинство сложностей, связанных с форматом CSV, начиная с запятых, встроенных в поля. (jq 1.5 имеет аналогичный фильтр @tsv для генерации файлов с разделителями-разделителями).

Конечно, если заголовки и значения гарантированно не содержат запятых и двойных кавычек, тогда не может быть необходимости использовать фильтр @csv. В противном случае было бы лучше использовать его.

Например, если «Название компании» было «Смит, Смит и Смит», и если другие значения были такими, как показано ниже, при вызове jq с параметром «-r» будет выдаваться допустимый CSV:

 $ jq -r '.data | map(.displayName), map(.value) | @csv' so.json2csv.json "First Name","Last Name","Position","Company Name","Country" "John (""Johnnie"")","Doe","Director, Planning and Posterity","Smith, Smith and Smith","Transylvania" 

Я нашел jq чтобы обернуть голову. Вот некоторые Ruby:

 ruby -rjson -rcsv -e ' data = JSON.parse(File.read "file.json") data["data"].collect {|item| [item["displayName"], item["value"]]} .transpose .each {|row| puts row.to_csv} ' 
 First Name,Last Name,Position,Company Name,Country VALUE,VALUE,VALUE,VALUE,VALUE 

Рубильный JSON-анализатор закрыл переднюю запятую перед закрывающей скобкой.

Поскольку вы отметили этот python и предположим, что имя json файла – x.json

 import os, json with open('x.json') as f: x = json.load(f) print '{}{}{}'.format(', '.join(y['displayName'] for y in x['data']), os.linesep, ', '.join(y['value'] for y in x['data'])) First Name, Last Name, Position, Company Name, Country VALUE, VALUE, VALUE, VALUE, VALUE 

Хотя мне пришлось удалить последнюю запятую в вашем примере ввода, чтобы заставить ее работать, потому что jq жаловался на ожидание другого элемента массива:

 INPUT | jq -r '[.[][].displayName], [.[][].value]| join(", ")' 

…подловил…

 First Name, Last Name, Position, Company Name, Country VALUE, VALUE, VALUE, VALUE, VALUE 

Как это работает в двух словах:

  1. Я перешел на третий уровень объектов данных, используя пустую форму поля индекса [] и обозначение .dot .
  2. Когда я достаточно глубоко, я задал поля данных, которые я хотел по имени .[][].displayName .
  3. Я заверил, что мои желаемые поля были связаны друг с другом, возвращая их в виде отдельных объектов массива, таких как [.[][].displayName], [.[][].value]
  4. И затем передал эти объекты в функцию join(", ") которая будет объединена как отдельные объекты.

По правде говоря, [.field] – это еще один способ map(.field) но это немного более специфично, поскольку он определяет уровень глубины для извлечения желаемых данных.

  • Преобразование аккордов TeX в UTF-8 в Python
  • Как получить определенную строку в xml с помощью python или perl и т. Д.
  • Запуск облачной печати Google при загрузке
  • аутентификация веб-браузера
  • Как отключить новую функцию истории в Python 3.4?
  • Python 2.7 устанавливается на Scientific Linux 6 через SCL devtoolset
  • Archlinux собственно PKGBUILD: исполняемая ошибка Python
  • Судоподобная память паролей для собственных скриптов
  • Лазанья не импортирует Python3 в монетный двор
  • Как запустить python SimpleHTTPServer на порту 80?
  • Включите SCL python27, чтобы другие RPM могли его видеть
  • Interesting Posts

    Доступ к передаче закрыт

    просмотрщик PDF с двухсторонним вариантом

    Как убедиться, что заставка не срабатывает при просмотре фильма?

    Машина Ubuntu с привязанным телефоном RNDIS не может получать пакеты из Интернета

    ssh не может открыть удаленное окно, ошибка сегментации (сбрасывание ядра)

    как открыть несколько окон в предопределенной компоновке с помощью одной команды

    Как установить backtrack 5 на USB, который не монтируется с существующей ОС

    Не удается удалить файл – разрешено разрешение – почему?

    Поиск определенного членства в группе пользователей с точным соответствием

    сравнить два файла, игнорируя 1-й столбец и номер строки печати

    Как создать туннель GRE с адреса IPv4 на адрес IPv6?

    Конфигурация iptables ssh через VPN

    Почему поля, не разделенные пробелом на выходе этого примера?

    Очистка после установки библиотеки

    qemu висит при загрузке Fedora 20 guest

    Linux и Unix - лучшая ОС в мире.