在 Mule 中使用 Dataweave 动态合并两个 CSV 文件

Dynamically merge two CSV files using Dataweave in Mule

我从不同来源获得不同长度的 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 以方便更好地搜索。但是需要关于如何在一个转换中追加内容以形成第三个文件的建议。

由于您想在不重命名列名的情况下合并两个 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

工作表达式如下。删除 id 应该发生在 default

之前

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