提前感谢您的支持。
我做了一些谷歌搜索,但没有任何帮助我。
我有两个具有一对多关系的输入csv文件(父子)。
如何使用这两个文件中的子字段为master中的每条记录创建json输出?谷歌搜索,我可以看到样本说1个单独的csv文件到json但不是多个。
这是一个例子
Parent File Employee
emp_no emp_name
1001 jhon
1002 mike
Child file Reportees
emp_no master_emp_no emp_name
1010 1001 x
1011 1001 y
1012 1001 z
1013 1002 A
1014 1002 B
我需要父表中每个条目的json对象,其中包含该父表的子表详细信息
first json object ----> 1001,john,[1010 x,1011 y,1012 z]
second json object ----> 1002,john,[1013 A,1014 B]
请建议。
答案 0 :(得分:0)
以下是使用jq
的解决方案如果文件filter.jq
包含
def parse:
reduce ( inputs # reads input tsv files and returns object
| { # {
f:input_filename, # "parent": [["emp_no",...], ["1001", "jho...
r:split("\t") # "child": [["emp_no","master_emp_no",...
} # }
| select(.r|length>0)) as $i
{}
; .[$i.f] += [$i.r]
)
;
def restructure:
[ # converts [["emp_no", "emp_name"],
.[0] as $h # ["1001", "jhon"], ["1002", "mike"]]
| .[1:][] as $v # to [{"emp_no":"1001","emp_name":"jhon"},
| [ [$h, $v] # {"emp_no":"1002","emp_name":"mike"}]
| transpose[]
| {key:.[0], value:.[1]}
] | from_entries
]
;
def format:
.child as $c # constructs the final output
| .parent # emp_no,emp_name,children
| map(.children = ( # 1001,jhon,["1010 x","1011 y","1012 z"]
.emp_no as $e # 1002,mike,["1013 A","1014 B"]
| $c
| map(select($e == .master_emp_no)
| "\(.emp_no) \(.emp_name)")
| tojson
)
)
| (.[0] | keys_unsorted), .[]
| join(",")
;
parse
| map_values(restructure)
| format
文件parent
包含制表符分隔值
emp_no emp_name
1001 jhon
1002 mike
,文件child
包含制表符分隔值
emp_no master_emp_no emp_name
1010 1001 x
1011 1001 y
1012 1001 z
1013 1002 A
1014 1002 B
然后命令
jq -M -R -n -r -f filter.jq parent child
将产生
emp_no,emp_name,children
1001,jhon,["1010 x","1011 y","1012 z"]
1002,mike,["1013 A","1014 B"]