【问题标题】:Use JQ to parse JSON array of objects, using select to match specified key-value in the object element, then convert to CSV使用 JQ 解析对象的 JSON 数组,使用 select 匹配对象元素中指定的键值,然后转换为 CSV
【发布时间】:2020-03-18 00:29:15
【问题描述】:

使用JQ解析对象的JSON数组,使用select匹配对象元素中的指定键值,然后转换为CSV。

数据来源:

{
  "Other": [],
  "Objects": [
    {
      "ObjectElementName": "Test 123",
      "ObjectElementArray": [],
      "ObjectElementUnit": "1"
    },
    {
      "ObjectElementName": "Test ABC 1",
      "ObjectElementArray": [],
      "ObjectElementUnit": "2"
    },
    {
      "ObjectElementName": "Test ABC 2",
      "ObjectElementArray": [],
      "ObjectElementUnit": "5"
    }
  ],
  "Language": "en-US"
}

JQ命令提取

jq -r '.Objects[] | select(.ObjectElementName | contains("ABC"))'

给定输出(仅限单个对象,无 JSON 结构)...

{
  "ObjectElementName": "Test ABC 1",
  "ObjectElementArray": [],
  "ObjectElementUnit": "2"
}
{
  "ObjectElementName": "Test ABC 2",
  "ObjectElementArray": [],
  "ObjectElementUnit": "5"
}

需要这种格式的输出(保留对象上方的 JSON 数组)

{
  "Other": [],
  "Objects": [
    {
      "ObjectElementName": "Test ABC 1",
      "ObjectElementArray": [],
      "ObjectElementUnit": "2"
    },
    {
      "ObjectElementName": "Test ABC 2",
      "ObjectElementArray": [],
      "ObjectElementUnit": "5"
    }
  ],
  "Language": "en-US"
}

需要这种格式的输出,所以可以执行CSV转换

in2csv -f json --key Objects > output.csv

需要输出 CSV

ObjectElementName,ObjectElementUnit
Test ABC 1,2
Test ABC 2,5

【问题讨论】:

    标签: json export-to-csv jq


    【解决方案1】:

    如果你想要 CSV,你可能应该使用 jq 的 @csv 过滤器,它基本上保证了有效的 CSV 输出。例如,使用您的输入:

    jq -r '
      ["ObjectElementName","ObjectElementUnit"],
      (.Objects[]
       | select(.ObjectElementName | test("ABC"))
       | [.ObjectElementName,.ObjectElementUnit] )
      | @csv' input.json
    

    产生:

    "ObjectElementName","ObjectElementUnit"
    "Test ABC 1","2"
    "Test ABC 2","5"
    

    但是,如果您愿意承担风险,您可以将 @csv 替换为 join(","),在本例中会导致:

    ObjectElementName,ObjectElementUnit
    Test ABC 1,2
    Test ABC 2,5
    

    【讨论】:

    • 谢谢,确认这行得通,但是有什么办法可以保留标题行吗?例如:ObjectElementName,ObjectElementUnit,后续行为...."Test ABC 1","2"
    • 完美:) 解决了
    猜你喜欢
    • 2020-04-10
    • 2022-10-07
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    相关资源
    最近更新 更多