【问题标题】:jq: map arrays to csv field headersjq:将数组映射到 csv 字段标题
【发布时间】:2021-11-19 17:56:41
【问题描述】:

有没有办法像这样导出 json:

{
   "id":"2261026",
   "meta":{
      "versionId":"1",
      "lastUpdated":"2021-11-08T15:13:39.318+01:00",
   },
   "address": [
      "string-value1",
      "string-value2"
   ],
   "identifier":[
      {
         "system":"urn:oid:2.16.724.4.9.20.93",
         "value":"6209"
      },
      {
         "system":"urn:oid:2.16.724.4.9.20.2",
         "value":"00042"
      },
      {
         "system":"urn:oid:2.16.724.4.9.20.90",
         "value":"UAB2"
      }
   ]
}
{
   "id":"2261027",
   "meta":{
      "versionId":"1",
      "lastUpdated":"2021-11-08T15:13:39.318+01:00",
   },
   "address": [
      "string-value1",
      "string-value2",
      "string-value3",
      "string-value4"
   ],
   "identifier":[
      {
         "system":"urn:oid:2.16.724.4.9.20.93",
         "value":"6205"
      },
      {
         "system":"urn:oid:2.16.724.4.9.20.2",
         "value":"05041"
      }
   ]
}

我想要这样的东西:

"id","meta_versionId","meta_lastUpdated","address","identifier0_system","identifier0_value","identifier1_system","identifier1_value","identifier2_system","identifier2_value"
"2261026","1","2021-11-08T15:13:39.318+01:00","string-value1|string-value2","urn:oid:2.16.724.4.9.20.93","6209","urn:oid:2.16.724.4.9.20.2","00042","urn:oid:2.16.724.4.9.20.90","UAB2"
"2261027","1","2021-11-08T15:13:39.318+01:00","string-value1|string-value2|string-value3|string-value4","urn:oid:2.16.724.4.9.20.93","6205","urn:oid:2.16.724.4.9.20.2","05041",,

简而言之:

address 数组字段字符串值必须映射到使用“|”连接其值特点。示例:"string-value1|string-value2"

identifiers 数组字段对象必须映射到 "n-field-header"。示例:"identifier0_system","identifier0_value","identifier1_system","identifier1_value","identifier2_system","identifier2_value,..."

有什么想法吗?

【问题讨论】:

    标签: json jq export-to-csv


    【解决方案1】:

    试试这个

    jq -r '[
      .id,
      (.meta | .versionId, .lastUpdated),
      (.address | join("|")),
      (.identifier[] | .system, .value)
    ] | @csv'
    

    Demo


    要在标题行前面加上 identifierX_systemidentifierX_value 字段对的数量与输入的最长 identifier 数组的长度相匹配,试试这个

    jq -rs '[
      
      "id",
      "meta_versionId", "meta_lastUpdated",
      "address",
      (
        range([.[].identifier | length] | max)
        | "identifier\(.)_system", "identifier\(.)_value"
      )
    
    ], (.[] | [
    
      .id,
      (.meta | .versionId, .lastUpdated),
      (.address | join("|")),
      (.identifier[] | .system, .value)
    
    ]) | @csv'
    

    Demo

    【讨论】:

    • 有没有办法自动添加标题?
    • 标题应该包含多少对identifierX_systemidentifierX_value
    • 最多4个,至少2个
    • 但这取决于什么?如果数字是常数,只需写出完整的标题并将其添加为第一个数组。对于变量数(例如所有identifier 数组的最大长度),您应该使用[inputs](或使用-s 选项)读取输入并将其放入变量中;然后计算您想要的数量并相应地生成标题数组;最后,将输入数组变量的内容输入到我们已有的内容中。
    • 不太清楚。你的意思是:(.identifier[0:3] | .system, .value)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2016-10-15
    • 2021-10-10
    • 1970-01-01
    相关资源
    最近更新 更多