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]
我正在阅读文件(见下文)。示例文件有 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]