Comment transformer JSON en CSV en utilisant jq dans la ligne de commande

L'outil shell jq est génial pour traiter les données JSON. Il peut également transformer ces données en fichiers CSV pratiques, prêts à répondre à tous vos besoins en matière de feuilles de calcul.

jqest un excellent petit outil qui vit dans votre terminal et fait des choses utiles avec les données JSON. C'est un outil puissant, mais aussi pratique pour les petites choses. Par exemple, si vous y dirigez des données JSON, il les imprime avec la coloration syntaxique? par défaut:

$ cat some-data.json|jq

Vous pouvez installer jq sur la plupart des systèmes. ( brew install jqsur un Mac avec homebrew / chocolatey install jqsur windows avec chocolatey). Cet article présente une jqtechnique plus avancée . Si vous souhaitez obtenir les bases, vous devriez consulter le didacticiel.

jqfonctionne avec n'importe quelle source JSON. Puisque je passe la plupart de mes journées à travailler avec des backends basés sur Sanity.io, je vais utiliser cela comme exemple. Aussi parce que je pense que ce que nous pouvons faire avec cette combinaison est extrêmement cool.

Sanity est un backend pour le contenu structuré et est livré avec une API en temps réel et un langage de requête appelé GROQ. Vous pouvez interagir avec Sanity via des clients HTTP et JS / PHP, mais aussi avec l'outil CLI avec $ sanity documents query 'GROQ-expression'.

Donc si vous voulez vos documents du type post, vous mettez $ sanity documents query '*[_type == "post"]'. Ou si vous voulez simplement ceux dont la date de publication est 2018, c'est $ sanity documents query '*[_type == "post" && publishedAt > "2018-01-01"]". Cette requête vous donne des documents entiers. Si vous vouliez simplement les titres et les dates de publication, vous écririez e: *[_type == "post"]{title, publishedà}.

Vous pouvez également sélectionner des clés et des valeurs à partir de données JSON jq. Aujourd'hui, nous allons l'utiliser pour transformer le contenu structuré d'un tableau JSON en un fichier CSV. Parce que votre patron veut des choses dans des feuilles Excel, non? Asseyez-vous bien et plongeons-nous! ? ‍

Supposons que vous souhaitiez une liste des titres, des slugs et des dates de publication de vos entrées de blog dans une feuille de calcul. L'expression entière ressemblerait à ceci:

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'

Vous pouvez copier ceci et l'exécuter avec ou jouer avec sur jqplay.com, mais voyons ce qui se passe dans jq-expression:

  • -rest pour --raw-ouputet s'assure que la sortie est un vieux texte ennuyeux sans couleurs ni formatage spécial.
  • (map(keys) | add | unique) as $cols(itère map) à travers les clés de votre objet et adds uniqueceux à une variable appelée $cols. En d'autres termes, c'est ainsi que sont créés vos en-têtes de colonnes.
  • map(. as $row | $cols | map($row[.])) as $rowsprend tous les objets du tableau externe et effectue une itération sur toutes les clés d'objet (titre, slug, publishedAt). Il ajoute les valeurs à un tableau, ce qui vous donne un tableau de tableaux avec les valeurs, ce que vous voulez lorsque vous transformez JSON en CSV.
  • $cols, $rows[] | @csvplace les en-têtes de colonne en premier dans le tableau, puis chacun des tableaux qui sont transformés en lignes en les acheminant vers @csv, ce qui formate la sortie comme… csv.

Cette commande imprime le résultat dans le shell. Si vous souhaitez l'écrire directement dans un fichier, vous pouvez y ajouter > filename.csv ou, par exemple, dans le presse-papiers (pipe it to | pbcopy si vous êtes sur macOS). Ou peut-être ferez-vous quelque chose d'excitant avec le csv dans pandas ?? en Python?

Si vous avez trouvé cela utile, nous aimerions en savoir plus dans la section des commentaires!

Si vous voulez essayer Sanity.io, vous pouvez aller sur sanity.io/freecodecamp et obtenir un plan développeur gratuit amélioré. ✨

Publié à l'origine sur sanity.io.