Как да трансформираме JSON в CSV, използвайки jq в командния ред

Инструментът за черупки jq е страхотен за работа с JSON-данни. Той също така може да трансформира тези данни в удобни CSV-файлове, готови за всички ваши нужди от електронни таблици.

jqе отличен малък инструмент, който живее във вашия терминал и прави полезни неща с JSON-данни. Това е мощен инструмент, но полезен и за малките неща. Например, ако прехвърлите JSON данни към него, той ги отпечатва с подчертаване на синтаксиса? по подразбиране:

$ cat some-data.json|jq

Можете да инсталирате jq на повечето системи. ( brew install jqна Mac с homebrew / chocolatey install jqна прозорци с шоколад). Тази публикация представя по-усъвършенствана jqтехника. Ако искате да получите основите, трябва да разгледате урока.

jqработи с всеки JSON източник. Тъй като прекарвам по-голямата част от дните си в работа с базирани на Sanity.io, ще използвам това като пример. Също така, защото мисля, че е изключително готино какво можем да направим с тази комбинация.

Sanity е бекенд за структурирано съдържание и се предлага с API в реално време и език за заявки, наречен GROQ. Можете да взаимодействате с Sanity чрез HTTP и JS / PHP клиенти, но също и с инструмента CLI с $ sanity documents query 'GROQ-expression'.

Така че, ако искате вашите документи от типа post, вие поставяте $ sanity documents query '*[_type == "post"]'. Или ако просто искате тези с дата на публикуване през 2018 г., това е $ sanity documents query '*[_type == "post" && publishedAt > "2018-01-01"]". Тази заявка ви дава цели документи. Ако просто искате заглавията и да публикувате дати, ще напишете e: *[_type == "post"]{title, publishedAt}.

Можете също така да изберете ключове и стойности от JSON данни jq. Днес ще го използваме, за да трансформираме структурирано съдържание в JSON масив в CSV файл. Защото шефът ви иска неща в листове на Excel, нали? Седнете здраво и нека се потопим! ? ‍

Да предположим, че искате списък със заглавията на вашите записи в блога и охлюви и да публикувате дати в електронна таблица. Целият израз би изглеждал така:

sanity documents query '*[_type == "post"]{title, "slug": slug.current, publishedAt}'|jq -r '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv'

Можете да копирате това и да стартирате с него или да играете с него на jqplay.com, но нека видим какво се случва в jq-expression:

  • -rе за --raw-ouputи гарантира, че изходът е обикновен стар скучен текст без цветове или специално форматиране.
  • (map(keys) | add | unique) as $colsитерации ( map) чрез ключовете във вашия обект и addS uniqueтакива, за да променлива с име $cols. С други думи, така се правят заглавките на колоните ви.
  • map(. as $row | $cols | map($row[.])) as $rowsвзема всички обекти във външния масив и прелиства през всички ключове на обекта (заглавие, плъзгач, publishedAt). Той добавя стойностите към масив, който ви дава масив от масиви със стойностите, което искате, когато трансформирате JSON в CSV.
  • $cols, $rows[] | @csvпоставя заглавките на колоните първо в масива и след това всеки от масивите, които се трансформират в редове, като ги пренасочват @csv, което форматира изхода като ... csv.

Тази команда отпечатва резултата в черупката. Ако искате да го напишете директно във файл, можете да добавите > filename.csv към него или, например, в клипборда ( to | pbcпрехвърлете го opy, ако сте на macOS). Или може би ще направите нещо вълнуващо с csv в панди ?? в Python?

Ако сметнете това за полезно, ще се радваме да чуем всичко за него в раздела за коментари!

Ако искате да изпробвате Sanity.io, можете да отидете на sanity.io/freecodecamp и да получите актуализиран безплатен план за разработчици. ✨

Първоначално публикувано на sanity.io.