簡體   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