【问题标题】:How to iterate through .json and get .csv?如何遍历 .json 并获取 .csv?
【发布时间】:2021-04-01 14:57:37
【问题描述】:

我有以下 json 内容:

{
"iccid": "1961021111937667",
"timeStamp": "2021-03-25T09:42:30.681Z",
"cycleStartDate": "2021-02-28T16:00:00.000Z",
"cycleEndDate": "2021-03-31T14:59:59.000Z",
"deviceCycleUsageInZones": {
"TEST-25GB, 1": [
{
"ratePlan": "TEST-25GB",
"ratePlanVersion": "1",
"zone": "default zone",
"dataUsage": 15155147646,
"dataUsageUnit": "bytes",
"voiceMTUsage": null,
"voiceMTUsageUnit": null,
"voiceMOUsage": null,
"voiceMOUsageUnit": null,
"smsmtusage": null,
"smsmousage": 3
}
],
"TEST-29GB, 1": [
{
"ratePlan": "TEST - 29602",
"ratePlanVersion": "1",
"zone": "default zone",
"dataUsage": null,
"dataUsageUnit": null,
"voiceMTUsage": 1080,
"voiceMTUsageUnit": "seconds",
"voiceMOUsage": 960,
"voiceMOUsageUnit": "seconds",
"smsmtusage": null,
"smsmousage": null
}
]
}
}

如何通过 .json 文件的内容得到下面的 .csv 输出?

1961021111937667, 2021-03-25T09:42:30.681Z,15155147646,bytes,null,null,null,null,null,3
1961021111937667, 2021-03-25T09:42:30.681Z,null,null,1080,seconds,960,seconds,null,null

换句话说,我希望包含以下标题:

iccid,timeStamp,dataUsage,dataUsageUnit,voiceMTUsage,voiceMTUsageUnit,voiceMOUsage,voiceMOUsageUnit,smsmtusage,smsmousage

【问题讨论】:

  • 嗨!请向我们展示您的尝试!

标签: linux iteration export-to-csv jq


【解决方案1】:

假设输入的结构如图所示,根据问题中的标题,保证以下内容会生成有效的 CSV(包括标题):

["iccid","timeStamp"] as $h1
| ["dataUsage","dataUsageUnit","voiceMTUsage","voiceMTUsageUnit","voiceMOUsage","voiceMOUsageUnit","smsmtusage","smsmousage"] as $h2
| ($h1+$h2),
  ([.[$h1[]]] + (.deviceCycleUsageInZones[][] | [.[$h2[]]] ))
| @csv

如果您真的不希望字符串被引用,那么将@csv 更改为join(","),并希望最好。

讨论

上述解决方案不依赖于 JSON 对象中键的顺序。这是使用成语实现的:

.[ $index[] ]

其中$index 是一个键名数组。这个小聪明是可能的,因为给定一个 jq 表达式 s,产生一个 JSON 值流 s1, s2, ...,jq 表达式$x[s] 计算为流:$x[s1], $x[ s2], ...,假设所有后面的 jq 表达式都是有效的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-07
    • 2022-11-28
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多