【问题标题】:Dynamically merge two CSV files using Dataweave in Mule在 Mule 中使用 Dataweave 动态合并两个 CSV 文件
【发布时间】:2019-06-01 18:32:11
【问题描述】:

我从不同来源获得不同长度的 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 mule anypoint-studio dataweave mulesoft


    【解决方案1】:

    由于您想在不重命名列名的情况下合并两个 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 列显示了两次。如何从第二个列表中摆脱它
    • 你是对的,我没有注意到这一点。我已经编辑了答案。现在试试。谢谢!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-12
      • 2023-03-19
      • 2013-04-22
      • 2020-11-22
      • 2020-09-13
      • 1970-01-01
      • 2017-09-14
      • 2017-09-06
      相关资源
      最近更新 更多