Mule 4.4 DataWeave 将计数器附加到文件

Mule 4.4 DataWeave append counter to file

我正在阅读文件(见下文)。示例文件有 13 行。

A|doe|chemistry|100|A|
B|shea|maths|90|A|
C|baba|physics|80|B|
D|doe|chemistry|100|A|
E|shea|maths|90|A|
F|baba|physics|80|B|
G|doe|chemistry|100|A|
H|shea|maths|90|A|
I|baba|physics|80|B|
J|doe|chemistry|100|A|
K|shea|maths|90|A|
L|baba|physics|80|B|
M|doe|chemistry|100|A|

然后使用 for each(批量大小 5)遍历这些行,然后调用 REST API 根据 REST API 响应(成功或失败),我正在将有效负载写入相应的成功/错误文件。

我模拟了被调用的 API,第一批 5 条记录将失败,其余文件将成功。

在写入成功/错误文件时,我正在使用以下转换:

output application/csv quoteValues=true,header=false,separator="|"
---
payload

一切正常。
成功日志文件:

"F"|"baba"|"physics"|"80"|"B"
"G"|"doe"|"chemistry"|"100"|"A"
"H"|"shea"|"maths"|"90"|"A"
"I"|"baba"|"physics"|"80"|"B"
"J"|"doe"|"chemistry"|"100"|"A"
"K"|"shea"|"maths"|"90"|"A"
"L"|"baba"|"physics"|"80"|"B"
"M"|"doe"|"chemistry"|"100"|"A"

错误日志文件:

"A"|"doe"|"chemistry"|"100"|"A"
"B"|"shea"|"maths"|"90"|"A"
"C"|"baba"|"physics"|"80"|"B"
"D"|"doe"|"chemistry"|"100"|"A"
"E"|"shea"|"maths"|"90"|"A"

现在我要做的是将 row/line 编号附加到每个文件,这样当它投入生产时,无论谁监视这些文件,都可以轻松理解原始文件并将其与原始文件相关联。 因此,作为错误日志文件的示例(第一批失败,即第 1 到 5 行),我想将这些数字附加到每一行:

"1"|"A"|"doe"|"chemistry"|"100"|"A"
"2"|"B"|"shea"|"maths"|"90"|"A"
"3"|"C"|"baba"|"physics"|"80"|"B"
"4"|"D"|"doe"|"chemistry"|"100"|"A"
"5"|"E"|"shea"|"maths"|"90"|"A"

不确定我应该在 DataWeave 中编写什么来实现这一点?

在 ForEach 范围内,您可以访问计数器 vars.counter(或您选择的任何名称,因为它是可配置的)。 您将需要遍历每个记录块以添加每个记录的位置。您可以使用类似的东西:

%dw 2.0
output application/csv quoteValues=true,header=false,separator="|"
var batchSize = 5
---
payload map ({
    counter: batchSize * (vars.counter - 1) + ($$ + 1)
} ++ $
)

或者如果您更喜欢使用 update 函数(尽管这会在最后一列添加记录计数器):

%dw 2.0
output application/csv quoteValues=true,header=false,separator="|"
var batchSize = 5
---
payload map (
    $ update {
        case .counter! -> batchSize * (vars.counter - 1) + ($$ + 1)
    }
)

请记住将此代码中的 batchSize 变量替换为您在 ForEach 范围内使用的相同值(如果已参数化,效果会更好)。

编辑 1 - 澄清:- 1+ 1 是因为两个索引(来自 For Each 范围的计数器和来自 map$$)都是 zero-based .

只是另一种解决方法,可以在不使用任何外部变量的情况下进行简化。该脚本可以分为两部分;第一个用于错误组,第二个用于成功。

%dw 2.0
output application/csv quoteValues=true,header=false,separator="|"
// Will be used for creating a counter for Error group
var errorIdx = 1  
 // Will be used for creating a counter for Success group
var successIdx = 6
---
//errorItems for the first 5 rows
(payload[0 to 4] map (items,idx) -> (({"0":(idx) + errorIdx} ++ items))) 

++

//successItems from 6 and remaining items.
(payload[5 to -1] map (items,idx) -> (({"0":(idx) + successIdx} ++ items))) 

DataWeave 内联变量:

  • errorIdx是启动错误计数器的指针
  • successIdx是启动成功计数器的指针

这将从索引 0 到 4 的元素中提取:

payload[0 to 4]

这将从索引 5 提取到剩余元素:

payload[5 to -1]