【问题标题】:Converting 1-to-many json into csv将 1 对多 json 转换为 csv
【发布时间】:2020-03-06 01:27:50
【问题描述】:

我正在尝试解析 API 调用的 json 输出。输出有一个订单数组,每个订单都有一个项目数组。我想解析输出,以便每个单独的项目都有一个带有其父订单 ID 的单个 CSV 输出。

因此,如果一个订单包含多个项目,我需要为其订单中的每个项目重复 orderID。我已经阅读了 jq 文档和几十个示例,并且我已经尝试了几个小时的反复试验。我很困惑如何做到这一点。

我在 jq 解析语法上苦苦挣扎。这些例子都没有真正的帮助,我只是感到困惑。以下是基础知识:

curl -s https://api.site.com/orders?page=1&pageSize=10 | jq '.'

下面是一个 json 示例。

{
  "orders": [
    {
      "orderId": 217356098,
      "items": [
        {
          "orderItemId": 327010821,
          "lineItemKey": "1",
          "sku": "AJC-C10S",
          "name": "TestDescription",
          "imageUrl": null,
          "weight": null,
          "quantity": 2,
          "unitPrice": 106.85,
          "taxAmount": null,
          "shippingAmount": null,
          "warehouseLocation": null,
          "options": [],
          "productId": null,
          "fulfillmentSku": null,
          "adjustment": false,
          "upc": null,
          "createDate": "2016-11-09T02:11:28.307",
          "modifyDate": "2016-11-09T02:11:28.307"
        },
        {
          "orderItemId": 327010822,
          "lineItemKey": "1",
          "sku": "AJC-C106",
          "name": "AnotherTestDescription",
          "imageUrl": null,
          "weight": null,
          "quantity": 2,
          "unitPrice": 106.85,
          "taxAmount": null,
          "shippingAmount": null,
          "warehouseLocation": null,
          "options": [],
          "productId": null,
          "fulfillmentSku": null,
          "adjustment": false,
          "upc": null,
          "createDate": "2016-11-09T02:11:28.307",
          "modifyDate": "2016-11-09T02:11:28.307"
        }
      ]
    },
  ],
  "total": 359934,
  "page": 1,
  "pages": 179968
}

预期输出(当然没有列标题):

orderId,orderItemId,sku,name
217356098,327010821,"JC-C10S","TestDescription"
217356098,327010822,"JC-C106","AnotherTestDescription"

如您所见,每个项目都有自己的行,但如果它们来自同一个订单,则 orderId 应该在每一行重复。

我该怎么做?

【问题讨论】:

    标签: json bash export-to-csv jq


    【解决方案1】:

    使用 -r 命令行选项,以下 jq 过滤器:

    .orders[]
    | .orderId as $oid
    | .items[]
    | [$oid, .orderItemId, .sku, .name]
    | @csv
    

    产生所需的输出。

    如果任何选定的值有可能是[],请考虑在上面的最后一行之前添加如下一行:

    | map_values(if . == [] then "NONE" else . end)
    

    【讨论】:

      【解决方案2】:

      谢谢!稍作改动即可:

      .orders[]
      | .orderId as $oid
      | .items[]
      | [$oid, .items.orderItemId, .items.sku, .items.name | tostring]
      | @csv
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-01
        • 2022-06-13
        • 2021-12-19
        • 2015-08-23
        • 2019-08-21
        • 2011-04-27
        相关资源
        最近更新 更多