当前位置: 首页 > 知识库问答 >
问题:

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

虞华翰
2023-03-14

我从不同的来源获得不同长度的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

       }
     )
   )
 )}

我在使用pull时遇到以下错误

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

    required :object, :function

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

共有2个答案

燕博文
2023-03-14

工作表达式如下所示。删除id应在默认值之前进行


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

左丘智渊
2023-03-14

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

 类似资料:
  • 我有一个这样的 CSV: 我使用spliter逐行处理记录,然后在dataweave中使用splitBy“,”将记录转换为地图。但我如何才能为“;”做另一个层次的拆分呢?SplitBy不允许多个分隔符,数据编织中的CSV类型也不允许。 最终,我想要一个这样的JSON: 有什么想法吗?

  • 我正在使用Mule 4.4,并尝试读取文件,然后使用Dataweave转换为JSON。这是文件(它没有标头),文件中的最后一行为空白 在读取文件时,将mime类型设置为application/csv(尽管其管道分隔),这会是一个问题吗? 我遇到的问题是,我想将文件内容转换为json,如下所示: 然而,它显示如下:(重复第一行) 我认为这种情况正在发生,因为骡子假设第一行包含标题.这是我的数据编织:

  • 我有json的请求和预期的响应,如下所述。它需要group pBy,我在中途卡住了在同一个地方循环。使用了和函数的组合。任何帮助都将不胜感激。 预期响应:

  • 我正在数据编织中查找 < code>lookup("myflow ",$) 我正在将整个 xml 传递给调用的流。流中接收的数据类型为“java.util.LinkedHashMap”。我正在尝试放置一个 ForEach 处理器并在集合中指定 xpath3。此获取错误,并显示消息: 根异常堆栈跟踪:java.lang.IllegalArgument异常:无法将类型为“java.util.Linke

  • 我正在寻找一个批处理文件合并所有CSV文件在一个特定的文件夹与行"LF"结束。 下面的脚本创建了一个带有“CRLF”EOL的输出文件,但是我的自动数据加载程序只接受“LF”EOL。 此外,我想在输出文件中有一个头。 帮助将不胜感激,因为我已经浪费了足够的时间寻找解决方案。 这就是我在下面尝试的。

  • 在编程我的bukkit插件时,我意识到我需要有自己的配置文件,这样我就可以在该文件中添加注释。我还需要能够更新配置(如果它已经创建并且是旧的)。 我最近还完成了一个简单的jQuery插件,其中使用了,并合并了两个设置数组。我想知道在配置文件的java中是否可以这样做。 我的问题: 相当简单。假设这是我的默认配置。插件已经在插件文件夹中复制了这个配置(如果还没有的话)。但是,这带来了一个问题: 有一