打印缺少键的空字符串并将结果转换为 CSV

Print empty string for a missing key and converting the result to CSV

我正在尝试使用 jq 命令将下方JSON 转换为 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

jq 中,您可以使用可用于 return 默认值的备用运算符 //。例如。如果输入

中没有 .foo 元素,.foo // 1 将计算为 1

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

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

注意:当foo的值为[=20=时,备用运算符.foo // 1导致评估为1 ] 或 false。如果您的数据包含 nullfalse 值,您可能希望修改上述程序。

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

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

对于您的样本,这会产生以下结果

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