【问题标题】:Pulling data out of JSON Object via jq to CSV in Bash通过 jq 从 JSON 对象中提取数据到 Bash 中的 CSV
【发布时间】:2019-08-28 20:42:11
【问题描述】:

我正在编写一个 bash 脚本(技术上通过 Windows 上的 gitBash 运行,但我认为这并不重要),它将一些 JSON API 数据转换为 CSV 文件。其中大部分都进​​行得相当好,特别是因为我对 JQ 不是特别熟悉,因为这是我第一次使用它。

我有一些类似于下面数组的 JSON 数据。我要做的是从数据中选择cardType、MaskedPan、金额和日期时间。

这可能是我人生中第一次谷歌搜索失败。我知道(或者我应该说认为)这实际上是一个对象,而不仅仅是一个简单的数组。

我还没有真正找到任何可以帮助我了解如何获取所需数据并将其导出到 CSV 文件的方法。获取我需要的其他数据没有问题,但事实证明这几部分对我来说是个大问题。

我正在尝试的脚本基本上可以归结为:

jq='/c/jq-win64.exe -r';

header='("cardType")';

fields='[.TransactionDetails[0].Value[0].cardType]';

$jq ''$header',(.[] | '$fields' | @csv)' < /t/API_Data/JSON/GetByDate-082719.json > 
/t/API_Data/CSV/test.csv;

如果我这样做 .TransactionDetails[0].Value 我可以获得整个数据块。但这在 CSV 中是有问题的,因为它包含逗号。

我想我可以把它做成一个 TSV,然后把它作为一个大字符串导入数据库,然后再把它子串出来。但这不是“正确”的解决方案。我确信 JQ 有办法给我我需要的东西。

    "TransactionDetails": [
        {
            "TransactionId": 123456789,
            "Name": "BlacklinePaymentDetail",
            "Value": "{\"cardType\":\"Visa\",\"maskedPan\":\"1234\",\"paymentDetails\":{\"reference\":\"123456789012\",\"amount\":99.99,\"dateTime\":\"2019/08/27 08:41:09\"}}",
            "ShowOnTill": false,
            "PrintOnOrder": false,
            "PrintOnReceipt": false
        }
    ]

理想情况下,我可以只在 CSV 中为 cardType、MaskedPan、amount 和 datetime 设置一个字段,而不是提取包含所有这些的“Value”。

任何建议将不胜感激。

【问题讨论】:

    标签: json export-to-csv jq


    【解决方案1】:

    您缺少的成分是fromjson,它将字符串化的 JSON 转换为 JSON。在示例输入周围添加大括号, 调用:

    jq -r -f program.jq input.json
    

    产生:

    "Visa","1234",99.99,"2019/08/27 08:41:09"
    

    program.jq 在哪里:

    .TransactionDetails[0].Value
    | fromjson
    | [.cardType, .maskedPan] + (.paymentDetails | [.amount, .dateTime])
    | @csv
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-20
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多