简体   繁体   English

使用 JQ 到特定的 csv 格式

[英]Using JQ to specific csv format

I have a json that looks like this:我有一个看起来像这样的 json:

[
  {
    "auth": 1,
    "status": "Active",
    "userCustomAttributes": [
      {
        "customAttributeName": "Attribute 1",
        "customAttributeValue": "Value 1"
      },
      {
        "customAttributeName": "Attribute 2",
        "customAttributeValue": "Value 2"
      },
      {
        "customAttributeName": "Attribute 3",
        "customAttributeValue": "Value 3"
      }
    ],
  },
  {
    "auth": 1,
    "status": "Active",
    "userCustomAttributes": [
      {
        "customAttributeName": "Attribute 1",
        "customAttributeValue": "Value 1"
      },
      {
        "customAttributeName": "Attribute 2",
        "customAttributeValue": "Value 2"
      },
      {
        "customAttributeName": "Attribute 3",
        "customAttributeValue": "Value 3"
      },
      {
        "customAttributeName": "Attribute 4",
        "customAttributeValue": "Value 4"
      }
    ],
  }
]

I would like to parse this and have a css output that looks something like this:我想解析这个并有一个看起来像这样的 css output:

authType, status, attribute 1, attribute 2, attribute 3, attribute 4
"1", "active", "value1", "value2", "value3",""
"1", "active", "value1", "value2", "value3","value 4"

The json has over 180k records in the array so it would need to loop through all of them. json 在数组中有超过 180k 条记录,因此需要遍历所有记录。 Some records don't have all the attributes.有些记录没有所有属性。 Some have all 4 yet some only have 1. I am hoping to show a null value in the csv for the records that don't have the attribute.有些人全部有 4 个,但有些人只有 1 个。我希望在 csv 中为没有该属性的记录显示 null 值。

With your sample input, the following program, which does not depend on the ordering of the "attribute" keys:使用您的示例输入,以下程序不依赖于“属性”键的顺序:

jq -r '
["Attribute 1", "Attribute 2", "Attribute 3", "Attribute 4"] as $attributes
# Header row
| ["authType", "status"] 
  + ($attributes | map( (.[:1] | ascii_upcase) + .[1:])),
# Data rows:
  (.[]
   | (INDEX(.userCustomAttributes[]; .customAttributeName)
      | map_values(.customAttributeValue)) as $dict
   | [.auth, .status] + [ $dict[ $attributes[] ] ]
   )
| @csv
'

produces the following CSV:产生以下 CSV:

"authType","status","Attribute 1","Attribute 2","Attribute 3","Attribute 4"
1,"Active","Value 1","Value 2","Value 3",
1,"Active","Value 1","Value 2","Value 3","Value 4"

You can easily modify this to emit a literal string of your choice in place of a JSON null value.您可以轻松地修改它以发出您选择的文字字符串来代替 JSON null 值。

Explanation解释

$dict[ $a[] ] produces the stream of values: $dict[ $a[] ]产生 stream 值:

$dict[ $a[0] ]
$dict[ $a[1] ]
...

This is used to ensure the columns are produced in the correct order, independently of the ordering or even presence of the keys.这用于确保以正确的顺序生成列,而与键的顺序甚至是否存在无关。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM