So transformieren Sie JSON mit jq in der Befehlszeile in CSV

Das Shell-Tool jq eignet sich hervorragend für den Umgang mit JSON-Daten. Es kann diese Daten auch in handliche CSV-Dateien umwandeln, die für alle Ihre Anforderungen an das Tabellenkalkulieren bereit sind.

jqist ein ausgezeichnetes kleines Tool, das in Ihrem Terminal lebt und nützliche Dinge mit JSON-Daten macht. Es ist ein starkes Werkzeug, aber auch praktisch für die kleinen Dinge. Wenn Sie beispielsweise JSON-Daten an diese weiterleiten, werden diese mit Syntaxhervorhebung gedruckt. standardmäßig:

$ cat some-data.json|jq

Sie können jq auf den meisten Systemen installieren. ( brew install jqauf einem Mac mit Homebrew / chocolatey install jqauf Fenstern mit Schokolade). Dieser Beitrag präsentiert eine fortgeschrittenere jqTechnik. Wenn Sie die Grundlagen erlernen möchten, sollten Sie das Tutorial lesen.

jqfunktioniert mit jeder JSON-Quelle. Da ich die meiste Zeit meiner Arbeit mit Sanity.io-basierten Backends verbringe, werde ich dies als Beispiel verwenden. Auch weil ich finde, dass es unglaublich cool ist, was wir mit dieser Kombination machen können.

Sanity ist ein Backend für strukturierte Inhalte und wird mit einer Echtzeit-API und einer Abfragesprache namens GROQ geliefert. Sie können mit Sanity über HTTP- und JS / PHP-Clients, aber auch mit dem CLI-Tool mit interagieren $ sanity documents query 'GROQ-expression'.

Wenn Sie also Ihre Dokumente vom Typ wollen post, setzen Sie $ sanity documents query '*[_type == "post"]'. Oder wenn Sie nur diejenigen mit einem Veröffentlichungsdatum im Jahr 2018 möchten, ist dies $ sanity documents query '*[_type == "post" && publishedAt > "2018-01-01"]". Diese Abfrage gibt Ihnen ganze Dokumente. Wenn Sie nur die Titel und Veröffentlichungsdaten möchten, schreiben Sie e: *[_type == "post"]{title, publishedAt}.

Sie können auch Schlüssel und Werte aus JSON-Daten auswählen jq. Heute werden wir damit strukturierten Inhalt in einem JSON-Array in eine CSV-Datei umwandeln. Weil Ihr Chef Sachen in Excel-Tabellen haben will, oder? Setz dich fest und lass uns eintauchen! ? ‍

Angenommen, Sie möchten eine Liste der Titel, Slugs und Veröffentlichungsdaten Ihrer Blogeinträge in einer Tabelle. Der ganze Ausdruck würde so aussehen:

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'

Sie können dies kopieren und damit ausführen oder auf jqplay.com damit spielen, aber lassen Sie uns sehen, was im Ausdruck vor sich geht jq:

  • -rist für --raw-ouputund stellt sicher, dass die Ausgabe einfacher alter langweiliger Text ohne Farben oder spezielle Formatierung ist.
  • (map(keys) | add | unique) as $colsiteriert ( map) durch die Schlüssel in Ihrem Objekt und adds uniquezu einer Variablen namens $cols. Mit anderen Worten, so werden Ihre Spaltenüberschriften erstellt.
  • map(. as $row | $cols | map($row[.])) as $rowsNimmt alle Objekte im äußeren Array und durchläuft alle Objektschlüssel (Titel, Slug, PubliziertAt). Die Werte werden an ein Array angehängt, wodurch Sie ein Array von Arrays mit den Werten erhalten. Dies ist das, was Sie möchten, wenn Sie JSON in CSV umwandeln.
  • $cols, $rows[] | @csvSetzt die Spaltenüberschriften zuerst in das Array und dann in jedes der Arrays, die durch Weiterleiten in Zeilen umgewandelt werden @csv, wodurch die Ausgabe als… csv formatiert wird.

Dieser Befehl druckt das Ergebnis in der Shell aus. Wenn Sie es direkt in eine Datei schreiben möchten, können Sie > filename.csv daran anhängen oder beispielsweise an die Zwischenablage (Pipe it to | pbcopy, wenn Sie unter macOS arbeiten). Oder vielleicht machst du etwas Aufregendes mit dem CSV in Pandas? in Python?

Wenn Sie dies nützlich fanden, würden wir gerne im Kommentarbereich alles darüber hören!

Wenn Sie Sanity.io ausprobieren möchten, können Sie unter sanity.io/freecodecamp einen erweiterten kostenlosen Entwicklerplan erhalten. ✨

Ursprünglich veröffentlicht bei sanity.io.