【问题标题】:Convert json to csv using jq with different key使用具有不同键的 jq 将 json 转换为 csv
【发布时间】:2021-10-29 22:36:57
【问题描述】:

给定一个 JSON 对象数组,我想输出一个 CSV,其中一行包含每个对象键,其他行基于每个对象值。

输入的json是:

{
  "PCID000": {
    "OSmodle": "LINUX",
    "IEversion": "2.15.0",
    "hardwareUSB": [
      "Card reader",
      "keyboard"
    ],
    "OrderStatus": "01"
  },
  "PCID999": {
    "OSmodle": "LINUX",
    "OSversion": "4.0",
    "hardwareUSB": [],
    "OrderStatus": "01"
  }
}

输出看起来像这样。标头可以硬编码。

PCID,OSmodle,OSversion,IEversion,hardwareUSB, OrderStatus
"PCID000","LINUX",,"2.15.0","Card reader&keyboard","01"
"PCID999","LINUX","4.0",,"01

【问题讨论】:

    标签: json linux ubuntu command jq


    【解决方案1】:

    您可以使用to_entries 函数将{"a": 1, "b": 2} 等对象转换为[{"key": "a", "value": 1}, {"key": "b", "value": 2}] 等键值对象数组。然后对其进行映射以选择关键值和感兴趣的部分。

    jq 脚本如下所示:

    to_entries | map([
        .key,
        .value.OSmodle,
        .value.OSversion,
        .value.IEversion,
        (.value.hardwareUSB | join("&")),
        .value.OrderStatus])
    | ["PCID", "OSmodle", "OSversion", "IEversion", "hardwareUSB", "OrderStatus"], .[]
    | @csv
    

    输出(-r):

    "PCID","OSmodle","OSversion","IEversion","hardwareUSB","OrderStatus"
    "PCID000","LINUX",,"2.15.0","Card reader&keyboard","01"
    "PCID999","LINUX","4.0",,"","01"
    

    jqplay

    【讨论】:

    • 您可以使用( . value | .OSmodle, .IEversion, (.hardwareUSB | join("&"))), .OrderStatus ) 而不是一遍又一遍地使用.value
    猜你喜欢
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多