MAGAZINE

ルーターマガジン

データ/フォーマット

jqコマンドでCSVを出力する方法

2024.05.30
Pocket

jqは、JSONデータを効率的に操作するための軽量で柔軟なコマンドラインツールです。この記事では、jqコマンドでCSVを出力する方法についてご紹介します。

まず、以下のようなJSONを用意します。

▼sample.json

[
  {
    "name": "Tanaka",
    "age": "28",
    "city": "Tokyo"
  },
  {
    "name": "Suzuki",
    "age": "32",
    "city": "Osaka"
  }
]

最終的には以下のようにCSVにすることが出来ます。

jq -r  '.[]|[.name,.age,.city]|@csv' sample.json  
"Tanaka","28","Tokyo"
"Suzuki","32","Osaka"

以降で、各ステップを解説します。

ステップ1 .[]で配列の中身を全て取り出す

.[]は、JSON配列の各要素の値を取り出します。

jq '.[]' sample.json
{
  "name": "Tanaka",
  "age": "28",
  "city": "Tokyo"
}
{
  "name": "Suzuki",
  "age": "32",
  "city": "Osaka"
}

ステップ2 [.name, .age, .city]でvalueのみを取り出す

[.name, .age, .city]をパイプで繋いで、各オブジェクトのname、age、cityの値を配列として取り出します。

jq '.[]|[.name,.age,.city]' sample.json
[
  "Tanaka",
  "28",
  "Tokyo"
]
[
  "Suzuki",
  "32",
  "Osaka"
]

ステップ3 @csvで配列からCSVへ

@csvは、 配列をCSV形式の文字列に変換します。

 jq '.[]|[.name,.age,.city]|@csv' sample.json
"\"Tanaka\",\"28\",\"Tokyo\""
"\"Suzuki\",\"32\",\"Osaka\""

JSONの値の文字列としてCSVに変換されるので、行ごとにダブルクォートで囲われてCSVのフィールドのダブルクォートがエスケープされている状態です。

ステップ4  -rオプションで余分なダブルクォーテーションを消す

-rオプションを使用することで、前後のダブルクォートやJSON文字列のエスケープを外して完成です。

jq -r  '.[]|[.name,.age,.city]|@csv' sample.json  
"Tanaka","28","Tokyo"
"Suzuki","32","Osaka"

また、フィールド内のダブルクォートは、ダブルクォートでエスケープしてくれます。

echo '[{"name": "Tana\"ka","age": "28","city": "Tokyo"}]'|jq -r '.[] | [.name, .age, .city] | @csv' 
"Tana""ka","28","Tokyo"

全てのフィールドがダブルクォートで囲われているので、フィールド内に改行やカンマがあっても安心ですね。

Pocket

CONTACT

お問い合わせ・ご依頼はこちらから