%dw 2.0
output application/csv quoteValues=true, separator=";", header=true
---
[
{
Aaa: payload.problem.Aaa[0],
Bbb: payload.problem.Bbb[0]
}
]
这个把它写成CSV这样:
Aaa;Bbb
1234; Test1
但这个有效载荷看起来是这样的:
"problem": {
"Aaa": [
"1234",
"1567",
"105"
],
"Bbb": [
"Test1",
"Test2",
"Test3"
]
}
我想写所有3个值或更多取决于我对CSV的请求。但现在我只能指定数组中的哪个元素(例如payload.sissues.Aaa[0](。因为在我的键Aaa下,我不知道会得到多少值来响应。
此解决方案假设第一列的数据与其他列的数据具有相同的行数。
首先,我使用函数namesOf((从payload.problem中的键名称中捕获列的名称,并将名称数组存储在变量列中。
然后我在第一个"列"上进行映射,得到每一行的索引。使用该索引,我对每个列名进行迭代,获得该索引处该列的值,并将其转换为键值(列名、行的该列值(。最后,我使用reduce((将同一行中的所有键值连接到一个对象中,该对象表示DataWeave期望转换为CSV的行。如果您将输出类型更改为JSON,您将更清楚地看到结构。
%dw 2.0
output application/csv quoteValues=true, separator=";", header=true
var columns=namesOf(payload.problem)
---
payload.problem[columns[0]] map ((item, index) -> (
columns map ($): payload.problem[$][index])
reduce ($$++$)
)
输出:
Aaa;Bbb
"1234";"Test1"
"1567";"Test2"
"105";"Test3"
如果列的大小不相同,您可以使用此替代方案,它将首先找到具有最大长度的列,并将其用作第一次迭代:
%dw 2.0
output application/csv quoteValues=true, separator=";", header=true
import firstWith from dw::core::Arrays
var columns=namesOf(payload.problem)
var maxColumnSize=max(columns map sizeOf(payload.problem[$]))
var maxColumnName=columns firstWith (sizeOf(payload.problem[$]) == maxColumnSize)
---
payload.problem[maxColumnName]
map ((item, index) -> (
columns map ($): payload.problem[$][index])
reduce ($$++$)
)