使用 MuleSoft / DataWeave 将 CSV 转换为 DB ETL,3:1 关系

问题描述 投票:0回答:1

我正在研究 CSV 到 DB ETL。我想使用 Mule 应用程序和 DataWeave。如果 CSV 行和表行之间存在 1:1 关系,那么这将是微不足道的。然而,对于这个用例,存在 3:1 的关系。

输入 CSV 的示例如下所示: “id”、“类型”、“val1”、“val2”、“val3” 1、A、5、、、 2、乙、、12、 3、C、、、“ABC” 也就是说,每一行都填充了某些列,例如“id”和“type”。但是,某些行中的值取决于另一列中的值(在本例中为“类型”)。在此示例中,如果类型为 A,则 val1 有值,如果为 B,则 val2 有值,如果类型为 C,则 val3 有值。

DataWeave 不擅长说“读取接下来的三行”然后与数据纠缠在一起。所以,我目前的想法是,我将拥有三个具有文件读取功能的处理器(操作),将 3 行放入变量中,然后将它们组合成数据库的记录。然而,是什么驱动了三行的获取呢?该代码需要读取到文件末尾的内容。但是没有流程,或者说 DW,会循环直到通用布尔值为真/假,就像我们在命令式语言中那样。解决方法是使用带有逃生舱口的递归调用。也许我会尝试组合“查找”来调用代码来设置变量,然后将该查找调用嵌套在递归函数中。

还有其他人遇到类似问题并解决了吗?

谢谢!

dataweave mulesoft
1个回答
0
投票

如果您需要将线分成 3 组,可以使用数组模块的 divideBy() 函数轻松完成

示例:

%dw 2.0
output application/json
import * from dw::core::Arrays
---
payload divideBy 3

输出数组的每个元素将是由输入数组的 3 项组成的数组,即 CSV 中的行。

您可能需要测试大型 CSV 文件的性能。我不确定流式传输是否可行,具体取决于divideBy() 是否使用索引访问。

© www.soinside.com 2019 - 2024. All rights reserved.