繁体   English   中英

多个CSV文件加入JSON输出?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM