JQ, convert CSV (parent child format) to JSON

本秂侑毒 提交于 2021-02-11 12:52:30

问题


I have a CSV file (parent child format). Is it possible to convert to JSON format by using JQ ?

CSV file <pre>

id  parent_id   text
1   NULL        engine
2   1           exhaust
3   1           cooling
4   3           cooling fan
5   3           water pump
6   NULL        frame
7   6           wheels
8   6           brakes
9   8           brake calipers
10  6           cables
</Pre>

JSON file <Pre>

[
{
"id": "1",
"text": "engine",
"children": [
{
"id": "2",
"text": "exhaust",
"children": []
},
{
"id": "3",
"text": "cooling",
"children": [
{
"id": "4",
"text": "cooling fan",
"children": []
},
{
"id": "5",
"text": "water pump",
"children": []
}
]
}
]
},
{
"id": "6",
"text": "frame",
"children": [
{
"id": "7",
"text": "wheels",
"children": []
},
{
"id": "8",
"text": "brakes",
"children": [
{
"id": "9",
"text": "brake calipers",
"children": []
}
]
},
{
"id": "10",
"text": "cables",
"children": []
}
]
}
]
</Pre>

回答1:


The following provides the basis for a complete solution to the stated problem. Instead of providing the redundant details about the children, it just provides their ids. If you really need the redundancy, then simply add one more post-processing step, which is trivial to do.

The solution here is based on the construction of a dictionary of "children".

Invocation

Along the lines of:

jq -R -f program.jq data.csv

Program

def obj($headers):
  . as $in
  | reduce range(0; $headers|length) as $i ({}; 
      .[$headers[$i]] = $in[$i]);

split(",") as $headers
| [ inputs
    | split(",")
    | map_values(if . == "NULL" then null else . end)
    | obj($headers) ]
| (reduce .[] as $row ({};
      if $row.parent_id
      then .[$row.parent_id] += [$row.id]
      else . end ) ) as $children
| map( del(.parent_id) | .children = ($children[.id] // []) )

Output

With the given input, the output begins as follows:

[
  {
    "id": "1",
    "text": "engine",
    "children": [
      "2",
      "3"
    ]
  },
  {
    "id": "2",
    "text": "exhaust",
    "children": []
  },



来源:https://stackoverflow.com/questions/65190223/jq-convert-csv-parent-child-format-to-json

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!