Sådan omdannes JSON til CSV ved hjælp af jq i kommandolinjen

Skalværktøjet jq er fantastisk til at håndtere JSON-data. Det kan også omdanne disse data til praktiske CSV-filer, der er klar til alle dine regnearkstridende behov.

jqer et fremragende lille værktøj, der bor i din terminal og gør nyttige ting med JSON-data. Det er et potent værktøj, men også praktisk til de små ting. For eksempel, hvis du rør JSON-data til det, udskriver det det med syntaksfremhævning? som standard:

$ cat some-data.json|jq

Du kan installere jq på de fleste systemer. ( brew install jqpå en Mac med hjemmebrygget / chocolatey install jqpå vinduer med chokoladeagtig). Dette indlæg præsenterer en mere avanceret jqteknik. Hvis du ønsker at få det grundlæggende, skal du tjekke vejledningen.

jqfungerer med enhver JSON-kilde. Da jeg bruger de fleste af mine dage på at arbejde med Sanity.io-baserede backends, bruger jeg det som et eksempel. Også fordi jeg synes, det er utroligt sejt, hvad vi kan gøre med denne kombination.

Sanity er en backend for struktureret indhold og leveres med en realtids API og et forespørgselssprog kaldet GROQ. Du kan interagere med Sanity via HTTP- og JS / PHP-klienter, men også med CLI-værktøjet med $ sanity documents query 'GROQ-expression'.

Så hvis du vil have dine dokumenter af typen post, sætter du det $ sanity documents query '*[_type == "post"]'. Eller hvis du bare vil have dem med en udgivelsesdato i 2018, er det $ sanity documents query '*[_type == "post" && publishedAt > "2018-01-01"]". Denne forespørgsel giver dig hele dokumenter. Hvis du bare ville have titlerne og offentliggøre datoer, ville du skrive e: *[_type == "post"]{title, publishedAt}.

Du kan også vælge nøgler og værdier fra JSON-data jq. I dag skal vi bruge det til at omdanne struktureret indhold i et JSON-array til en CSV-fil. Fordi din chef vil have ting i Excel-ark, ikke? Sid stramt, og lad os dykke ind! ? ‍

Lad os sige, at du vil have en liste over dine blogindlægs titler, slugs og offentliggøre datoer i et regneark. Hele udtrykket ville se sådan ud:

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'

Du kan kopiere dette og køre med det eller spille med det på jqplay.com, men lad os se, hvad der foregår i jq-ekspressionen:

  • -rer til --raw-ouputog sørger for, at output er almindelig kedelig tekst uden farver eller speciel formatering.
  • (map(keys) | add | unique) as $colsitererer ( map) gennem tasterne i dit objekt og adds uniquetil en kaldet variabel $cols. Med andre ord, sådan er dine kolonneoverskrifter lavet.
  • map(. as $row | $cols | map($row[.])) as $rowstager alle objekter i det ydre array og gentages gennem alle objektnøglerne (titel, slug, publishedAt). Det føjer værdierne til en matrix, som giver dig en matrix med arrays med værdierne, hvilket er det, du vil have, når du omdanner JSON til CSV.
  • $cols, $rows[] | @csvsætter kolonneoverskrifterne først i arrayet, og derefter hver af de arrays, der omdannes til linjer ved at føre dem til @csv, som formaterer output som ... csv.

Denne kommando udskriver resultatet i skallen. Hvis du vil skrive det direkte til en fil, kan du føje > filename.csv til den eller for eksempel til udklipsholderen (rør den op, to | pbchvis du bruger MacOS). Eller måske gør du noget spændende med csv i pandaer ?? i Python?

Hvis du fandt dette nyttigt, vil vi meget gerne høre alt om det i kommentarfeltet!

Hvis du vil prøve Sanity.io, kan du gå til sanity.io/freecodecamp og få en opgraderet gratis udviklerplan. ✨

Oprindeligt udgivet på sanity.io.