我有一个任务要从多个JSON有效负载生成CSV文件(2)。下面是我的样本数据,为理解目的提供了帮助
- Payload-1
[
{
"id": "Run",
"errorMessage": "Cannot Run"
},
{
"id": "Walk",
"errorMessage": "Cannot Walk"
}
]
- Payload-2 (**Source Input**) in flowVars
[
{
"Action1": "Run",
"Action2": ""
},
{
"Action1": "",
"Action2": "Walk"
},
{
"Action1": "Sleep",
"Action2": ""
}
]现在,我必须在一个条件下生成带有额外列的CSV文件到Source输入和ErrorMessage,其中负载1中的id与sourceInput字段匹配,那么errorMessageE 210应该分配给该请求字段并生成一个CSV文件作为输出。
我试过用下面的数据编织
%dw 1.0
%output application/csv header=true
---
flowVars.InputData map (val,index)->{
Action1: val.Action1,
Action2: val.Action2,
(
payload filter ($.id == val.Action1 or $.id == val.Action2) map (val2,index) -> {
ErrorMessage: val2.errorMessage replace /([\n,\/])/ with ""
}
)
}但是,在这里,我面临一个问题,我能够像预期的那样生成带有数据的文件,但是头ErrorMessage与我的实际数据(在生产中)缺少/没有出现在文件中。请帮助我。
并期望下面的CSV输出
Action1,Action2,ErrorMessage
Run,,Cannot Run
,Walk,Cannot Walk
Sleep,发布于 2019-03-14 14:25:06
假设"Payload-1“是payload,而"Payload-2”是flowVars.actions,我将首先使用payload创建键值查找。然后我会用它来填充flowVars.actions
%dw 1.0
%output application/csv header=true
// Creates lookup, e.g.:
// {"Run": "Cannot run", "Walk": "Cannot walk"}
%var errorMsgLookup = payload reduce ((obj, lookup={}) ->
lookup ++ {(obj.id): obj.errorMessage})
---
flowVars.actions map ((action) -> action ++ errorMsgLookup[action.Action1])注意:我还假设flowVars.action的id字段在整个数组中是唯一的。
发布于 2019-03-14 14:25:18
你好,解决这类问题的最好方法是使用groupBy。这样做的想法是,您可以将两个部分中的一个groupBy用于join,然后迭代另一个部分并进行查找。这样可以避免O(n^2)并将其转换为O(n)
%dw 1.0
%var payloadById = payload groupBy $.id
%output application/csv
---
flowVars.InputData map ((value, index) ->
using(locatedError = payloadById[value.Action2][0] default payloadById[value.Action1][0]) (
(value ++ {ErrorMessage: locatedError.errorMessage replace /([\n,\/])/ with ""}) when locatedError != null otherwise value
)
)
filter $ != nullhttps://stackoverflow.com/questions/55164551
复制相似问题