3

我正在尝试使用 jq 命令将 belowJSON 转换为 CSV,但最终的 CSV 无法正确放置 deviceName 字段,因为它在某些 JSON 行中丢失。

{
  "id": "ABC",
  "deviceName": "",
  "total": 100,
  "master": 20
}
{
  "id": "ABC",
  "total": 100,
  "master": 20
}

我如何确保在缺少 Key 时获得空值?

我试过下面的命令来生成 CSV

./jq -r '[.[]] | @csv' > final.csv

但它提供了如下所示的 CSV,您可以看到当 JSON 中缺少 deviceName 键时,它的单元格向左侧移动。

"ABC","",100,20
"ABC",100,20

我想输出类似下面的内容,如果缺少 deviceName,它会添加空值。

"ABC","",100,20
"ABC","",100,20
4

2 回答 2

4

您可以使用可用于返回默认值jq的备用运算符。//例如 .foo // 1,将评估输入中1是否没有.foo元素

""如果密钥不存在,则使用它并附加一个空字符串,您可以这样做

jq -r '[.id // "", .deviceName // "", .total // "", .master // ""] | @csv'

注意:当 的值为或时,备用运算符.foo // 1会导致1对大小写的评估。如果您的数据包含或值,您可能希望修改上述程序。foonullfalsenullfalse

于 2020-01-29T06:08:52.193 回答
2

您可以将第一个对象作为完整记录的参考,例如

keys_unsorted as $k | (., inputs) | [.[$k[]]] | @csv

对于您的示例,这会产生以下内容

"ABC","",100,20
"ABC",,100,20
于 2020-01-29T06:20:52.653 回答