首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CSV文件的多个JSON有效负载

CSV文件的多个JSON有效负载
EN

Stack Overflow用户
提问于 2019-03-14 14:05:00
回答 2查看 219关注 0票数 0

我有一个任务要从多个JSON有效负载生成CSV文件(2)。下面是我的样本数据,为理解目的提供了帮助

代码语言:javascript
复制
 - 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中的idsourceInput字段匹配,那么errorMessageE 210应该分配给该请求字段并生成一个CSV文件作为输出。

我试过用下面的数据编织

代码语言:javascript
复制
%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输出

代码语言:javascript
复制
Action1,Action2,ErrorMessage
Run,,Cannot Run
,Walk,Cannot Walk
Sleep,
EN

回答 2

Stack Overflow用户

发布于 2019-03-14 14:25:06

假设"Payload-1“是payload,而"Payload-2”是flowVars.actions,我将首先使用payload创建键值查找。然后我会用它来填充flowVars.actions

代码语言:javascript
复制
%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.actionid字段在整个数组中是唯一的。

票数 0
EN

Stack Overflow用户

发布于 2019-03-14 14:25:18

你好,解决这类问题的最好方法是使用groupBy。这样做的想法是,您可以将两个部分中的一个groupBy用于join,然后迭代另一个部分并进行查找。这样可以避免O(n^2)并将其转换为O(n)

代码语言:javascript
复制
%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 $ != null
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55164551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档