[英]Multilple csv files joining to json output?
預先感謝您的支持。
我做了一些谷歌搜索,但沒有任何幫助。
我有兩個輸入CSV文件,它們之間存在一對多的關系(父級子級)。
如何使用來自這兩個文件的子字段為主文件中的每個記錄創建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]
請指教。
這是使用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"]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.