使用 JQ 将带有标题的 JSON 导出为 CSV

Tec*_*tud 3 text-processing csv json jq

我有一个(字典?)JSON 文件,类似于:

{
  "Salad": {
    "name": "Dressing",
    "good": true,
    "status": true
  },
  "Data_XML": {
    "name": "XML",
    "good": false
  },
  "Functionality": {
    "name": "FUNC",
    "good": true
  },
  "Data_JSON": {
    "name": "JSON",
    "good": true,
    "status": false
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找这样的 CSV 输出:

"title","good","name","status"
"Salad",true,"Dressing",true
"Data_XML",false,"XML",""
"Functionality",true,"FUNC",""
"Data_JSON",true,"JSON",false
Run Code Online (Sandbox Code Playgroud)

什么我发现,到目前为止,采用的是这个...

jq -r '(map(keys_unsorted) | add | unique) as $cols | $cols, map(. as $row | $cols | map($row[.]))[] | @csv'
Run Code Online (Sandbox Code Playgroud)

输出:

"good","name","status"
true,"Dressing",true
false,"XML",
true,"FUNC",
true,"JSON",false
Run Code Online (Sandbox Code Playgroud)

我需要相当于Salad、Data_XML、Functionality 和 Data_JSON作为第一列(未排序)以及相关数据。

至于“好”、“名称”、“状态”,这些将是 Header 字段,因此需要动态检索,因为它们是随机的(每个数据集可能有 4 个,而其他数据集可能有 10 个)。这是一个相对较大的文件,很难手动解析这些文件,将“标题”作为第一列标题项。“title”、“good”、“name”、“status”、“something”、“else”、“random”、“etc”

我觉得我很接近......非常感谢任何帮助!

Ech*_*444 6

我认为这会奏效:

jq  -r '["title","name","good","status"],(to_entries|.[]|  
        [.key,.value.good,.value.name,
          (if .value.status == null then "" else .value.status end )]
        )|@csv'
Run Code Online (Sandbox Code Playgroud)

新版本更通用

jq -r ' to_entries as $row | 
  ( ( map(keys_unsorted ) | add | unique ) as $cols |
    ( ["title" , $cols] | flatten) , 
  ( $row | .[] as $onerow | $onerow | 
       ( [ .key , ( $cols |   
           map ($onerow.value[.] as $v | if $v == null then "" else $v end )  ) ] 
         | flatten ) ) ) | @csv '
Run Code Online (Sandbox Code Playgroud)