json - JQ 到 CSV 问题
问题描述
我以前在这里得到了一些关于 jq 到 csv 问题的帮助。我遇到了一个问题,其中一些 json 文件有一些额外的值会破坏 jq 命令
这是json数据。修复部分是破坏 jq 命令的原因
[
{
"Name": "John Doe",
"Car": [
"Car1",
"Car2"
],
"Location": "Texas",
"Repairs: {
"RepairLocations": {
"RepairsCompleted":[
"Fix1",
"Fix2"
]
}
}
},
{
"Name": "Jane Roe",
"Car": "Car1",
"Location": [
"Illinois",
"Kansas"
]
}
]
这是命令
def expand($keys):
. as $in
| reduce $keys[] as $k ( [{}];
map(. + {
($k): ($in[$k] | if type == "array" then .[] else . end)
})
) | .[];
(.[0] | keys_unsorted) as $h
| $h, (.[] | expand($h) | [.[$h[]]]) | @csv
这是我想要得到的最终结果。该数据不是实际数据。
Name,Car,Location,Repairs:RepairLocation
John Doe,Car1,Texas,RepairsCompleted:Fix1
John Doe,Car1,Texas,RepairsCompleted:Fix2
John Doe,Car2,Texas,RepairsCompleted:Fix1
John Doe,Car2,Texas,RepairsCompleted:Fix2
Jane Roe,Car1,Illinois,
Jane Roe,Car1,Kansas,
对此的任何建议都会很棒。我正在努力弄清楚 jq
解决方案
可以使用您已经提出的类似问题的答案之一中所示的相同技术获得一个简单的解决方案。唯一的区别是在“修复”键不存在的情况下满足您的要求:
["Name", "Car", "Location", "Repairs:RepairLocation"],
(.[]
| [.Name]
+ (.Car|..|scalars|[.])
+ (.Location|..|scalars|[.])
+ (.Repairs|..|scalars
| [if . == null then . else "RepairsCompleted:\(.)" end]) )
| @csv
使用辅助函数避免重复
def s: .. | scalars | [.];
["Name", "Car", "Location", "Repairs:RepairLocation"],
(.[]
| [.Name]
+ (.Car|s)
+ (.Location|s)
+ (.Repairs|s|map(if . == null then . else "RepairsCompleted:\(.)" end)))
| @csv
推荐阅读
- android - 将数据从活动 B 传递到 A 而 B 未完成
- javascript - 在反应原生功能组件中传递引用
- node.js - 正确测试 Azure Functions
- arrays - 在两个数组的除法中使用指针
- sqlite - 我如何有效地查询与 Set in moor 中的任一单词匹配的表条目
- javascript - 如何在 Monaco Editor Command Palette 中以编程方式触发转到行号操作?
- c# - 身份验证服务。ASP.Net Core 中的 HttpContext.Current.Session
- java - JOOQ“IN”查询抛出空指针异常
- python - Python:具有关键字键盘中断的健壮连续循环
- javascript - 上传多个文件和元数据的最佳方式是什么?