通过jq将数据从JSON对象中提取到Bash中的CSV

时间:2019-08-28 20:42:11

标签: json export-to-csv jq

我正在研究一个bash脚本(从技术上讲是通过Windows上的gitBash运行,但我认为这并不重要),它将一些JSON API数据转换为CSV文件。大多数情况都进行得相当不错,尤其是因为我不是特别熟悉JQ,因为这是我第一次使用它。

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

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

我还没有发现任何可以帮助我了解如何获取所需数据并将其导出到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,金额和日期时间的字段,而不必提取包含所有字段的“值”。

任何建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

您缺少的成分是library(purrr) teamstats <- fromJSON("https://statsapi.web.nhl.com/api/v1/teams?expand=team.stats") team2 <- teamstats[["teams"]]$teamStats final <- map_df(team2,~as.data.frame(t(unlist(.x[["splits"]])))) # you can ignore the warning information here final ,它将字符串化的JSON转换为JSON。在样本输入周围添加括号, 调用:

fromjson

产生:

jq -r -f program.jq input.json

其中program.jq是:

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