需要jq帮助将格式不正确但非常简单的json文件转换为csv吗

需要jq帮助将格式不正确但非常简单的json文件转换为csv吗,json,csv,tensorflow,key,jq,Json,Csv,Tensorflow,Key,Jq,我有点问题。我已经尝试了很多不同的jq-r迭代,来对付对象检测器吐出的一大组json文件,但我就是无法满足于给我一个csv文件。我用完全相同的数据结构将这些海量文件简化为下面的一个非常简短的示例(注意,“book”、“person”、“animal”等名称在脚本中不断变化,因此如果有一种方法可以在不硬编码命令中的键的情况下实现这一点,这将是最理想的,但不是必需的) 例如: { "/src/files/image_1.png": { "book

我有点问题。我已经尝试了很多不同的
jq-r
迭代,来对付对象检测器吐出的一大组json文件,但我就是无法满足于给我一个csv文件。我用完全相同的数据结构将这些海量文件简化为下面的一个非常简短的示例(注意,“book”、“person”、“animal”等名称在脚本中不断变化,因此如果有一种方法可以在不硬编码命令中的键的情况下实现这一点,这将是最理想的,但不是必需的)

例如:

{
    "/src/files/image_1.png": {
        "book": 0.01711445301771164,
        "person": 0.000330559065533263624,
        "place": 0.9814764857292175,
        "animal": 1.8662762158783153e-05,
        "vehicle": 0.0010597968939691782
    },
    "/src/files/image_2.png": {
        "book": 0.23741412162780762,
        "person": 0.1587823033328247,
        "place": 0.59659236669504,
        "animal": 0.0036556862760335207,
        "vehicle": 0.003555471543222666
    }
}
理想情况下,我希望制作一个csv文件,其表格格式如下:

文件 书 人 放置 动物 车辆 /src/files/image_1.png 0.01711445301771164 0.000330559065533263624 0.9814764857292175 1.8662762158783153e-05 0.0010597968939691782 /src/files/image_2.png 0.23741412162780762 0.1587823033328247 0.59659236669504 0.0036556862760335207 0.003555471543222666

两者都不能很好地处理空输入(
{}


为了进行比较,@peak的标题解决方案是

keys_unsorted as $ids |
( .[ $ids[0] ] | keys_unsorted ) as $fields |
(
   [ "id", $fields[] ],
   ( $ids[] as $id | [ $id, .[$id][$fields[]] ] )
) | @csv


它也不能处理空输入(
{}
)或者

以下解决方案比其他解决方案要复杂一些,因为它是“数据驱动的”(jq程序中除了“文件”之外没有硬编码的键名),同时不假设内部键的顺序一致:

  keys_unsorted as $outer
  | (.[$outer[0]] | keys_unsorted) as $inner
  | ["File"] + ($inner|map((.[:1]|ascii_upcase) + .[1:])),
    ($outer[] as $k
     | [$k] + [.[$k] | .[$inner[]]])
  | @tsv
当然,您可能希望使用
@csv
而不是
@tsv


(有许多问题说明了如何添加标题,例如,以下示例说明了如何在不硬编码的情况下添加标题,以及在主标题下动态生成“-”行:)

JSON的半错误形式是什么?这个例子不是我所说的一个好例子——我想这是一个我提供了太多关于文件中的问题的信息的例子,这些问题偏离了目标。一个带有“随机”排序列的表如果没有标题行就没有用处。这确实比我的努力好得多,但是ikegami的是一个完整的解决方案。我需要做一点阅读,才能达到和你一样好的脚本编写水平。@DavidMoore-既然你想要一个完整的解决方案,它现在就提供了,包括标题名的大写。我不知道你不想硬编码字段名。修好了,好极了!你的例子非常有效。我需要多读一点关于为什么这样做,但我感谢你的帮助。
keys_unsorted as $ids |
( .[ $ids[0] ] | keys_unsorted ) as $fields |
(
   [ "id", $fields[] ],
   ( $ids[] as $id | [ $id, .[$id][$fields[]] ] )
) | @csv
  keys_unsorted as $outer
  | (.[$outer[0]] | keys_unsorted) as $inner
  | ["File"] + ($inner|map((.[:1]|ascii_upcase) + .[1:])),
    ($outer[] as $k
     | [$k] + [.[$k] | .[$inner[]]])
  | @tsv