jqを使用して列中心JSONの値をCSV形式に抽出します。

jqを使用して列中心JSONの値をCSV形式に抽出します。

rankデータが配列の列挙列として保存される次のJSONファイルがあります。

{
  "data": [
    {
      "displayName": "First Name",
      "rank": 1,
      "value": "VALUE"
    },
    {
      "displayName": "Last Name",
      "rank": 2,
      "value": "VALUE"
    },
    {
      "displayName": "Position",
      "rank": 3,
      "value": "VALUE"
    },
    {
      "displayName": "Company Name",
      "rank": 4,
      "value": "VALUE"
    },
    {
      "displayName": "Country",
      "rank": 5,
      "value": "VALUE"
    }
  ]
}

ヘッダーは列値から出力され、列のdisplayNameデータはvalue単一のキー値である次の形式のCSVファイルが必要です。

First Name, Last Name, Position, Company Name, Country
VALUE, VALUE, VALUE, VALUE, VALUE

のみ使用してこれは可能ですかjq?私はプログラミング技術が全くありません。

ベストアンサー1

jqには、配列をCSV文字列に変換するフィルタ@csvがあります。このフィルタは、フィールドに含まれるカンマから始まり、CSV形式に関連する複雑さの大部分を考慮します。 (JQ 1.5には、タブ区切り値ファイルを生成するための同様のフィルタ@tsvがあります。)

もちろん、タイトルと値の両方にカンマと二重引用符がないことが保証されている場合は、@csvフィルタを使用する必要はないかもしれません。そうでなければ、それを使用する方が良いかもしれません。

たとえば、「会社名」が「Smith、Smith、およびSmith」で、他の値が次の場合、「-r」オプションでjqを呼び出すと、有効なCSVが生成されます。

$ jq -r '.data | map(.displayName), map(.value) | @csv' so.json2csv.json
"First Name","Last Name","Position","Company Name","Country"
"John (""Johnnie"")","Doe","Director, Planning and Posterity","Smith, Smith and Smith","Transylvania"

おすすめ記事