多个csv文件加入json输出?

时间:2015-09-30 15:41:13

标签: json csv

提前感谢您的支持。

我做了一些谷歌搜索,但没有任何帮助我。

我有两个具有一对多关系的输入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]

请建议。

1 个答案:

答案 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"]