【问题标题】:Multilple csv files joining to json output?多个csv文件加入json输出?
【发布时间】:2015-09-30 15:41:13
【问题描述】:

提前感谢您的支持。

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

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

请指教。

【问题讨论】:

  • 请格式化一下。
  • 好多了。除了你缺少一些关键元素。看看这个stackoverflow.com/help/how-to-ask。为了让人们提供帮助,您必须使用某种语言/算法表现出一些努力/尝试。这不是一个免费的家庭作业论坛。
  • 我可以说 java 可能是生成 json 对象然后使用 xslt 进行验证和转换的最佳选择

标签: json csv


【解决方案1】:

这是使用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"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 2017-04-24
    • 2021-08-26
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多