1

我从不同来源获得不同长度的 CSV 文件。CSV 中的列是不同的,唯一的例外是每个 CSV 文件总是有一个 Id 列,可用于绑定不同 CSV 文件中的记录。一次需要处理两个这样的 CSV 文件。该过程是从第一个文件中获取 Id 列并匹配第二个 CSV 文件中的行,并创建第三个文件,其中包含来自第一个和第二个文件的内容。id 列可以在第一个文件中重复。例如下面给出。请注意,第一个文件我可能有 18 到 19 个不同数据列的组合,因此,我无法在 dataweave 中对转换进行硬编码,并且每次都会添加一个新文件。动态方法是我想要完成的。所以一旦写出来,即使添加了新文件,该逻辑也应该起作用。这些文件也变得相当大。

下面给出了示例文件。

CSV1.csv
--------
id,col1,col2,col3,col4
1,dat1,data2,data3,data4
2,data5,data6,data6,data6
2,data9,data10,data11,data12
2,data13,data14,data15,data16
3,data17,data18,data19,data20
3,data21,data22,data23,data24

CSV2.csv
--------
id,obectId,resid,remarks
1,obj1,res1,rem1
2,obj2,res2,rem2
3,obj3,res3,rem3

Expected file output -CSV3.csv
---------------------
id,col1,col2,col3,col4,objectid,resid,remarks
1,dat1,data2,data3,data4,obj1,res1,rem1
2,data5,data6,data6,data6,obj2,res2,rem2
2,data9,data10,data11,data12,obj2,res2,rem2
2,data13,data14,data15,data16,obj2,res2,rem2
3,data17,data18,data19,data20,obj3,res3,rem3
3,data21,data22,data23,data24,obj3,res3,rem3

我正在考虑使用 pluck 来获取第一个文件的列值。我的想法是在不对其进行硬编码的情况下获取转换中的列。但是我遇到了一些错误。在此之后,我的任务是搜索 id 并从第二个文件中获取值

{(
   using(keys = payload pluck $$)
   (
     payload map 
     ( (value, index) ->
       { 
         (keys[index]) : value

       }
     )
   )
 )}

使用 pluck 时出现以下错误

Type mismatch for 'pluck' operator
     found :array, :function

    required :object, :function

我正在考虑在第二个文件的 id 上使用 groupBy 以促进更好的搜索。但是需要关于如何在一个转换中附加内容以形成第三个文件的建议。

4

2 回答 2

2

由于您想在不重命名列名的情况下合并两个 CSV,您可以尝试以下操作

var file2Grouped=file2 groupBy ((item) -> item.id)
---
file1 map ((item) -> item ++ ((file2Grouped[item.id])[0] default {}) - 'id')

输出

id,col1,col2,col3,col4,obectId,resid,remarks
1,dat1,data2,data3,data4,obj1,res1,rem1
2,data5,data6,data6,data6,obj2,res2,rem2
2,data9,data10,data11,data12,obj2,res2,rem2
2,data13,data14,data15,data16,obj2,res2,rem2
3,data17,data18,data19,data20,obj3,res3,rem3
3,data21,data22,data23,data24,obj3,res3,rem3

于 2019-06-01T19:30:33.930 回答
0

工作表达式如下。删除 id 应该发生在默认值之前


var file2Grouped=file2 groupBy ((item) -> item.id)
---
file1 map ((item) -> item ++ ((file2Grouped[item.id])[0] - 'id' default {}))

于 2019-06-03T20:25:57.973 回答