Несколько полезных нагрузок JSON в CSV-файл - PullRequest
0 голосов
/ 14 марта 2019

У меня есть задача создать файл CSV из нескольких полезных нагрузок JSON (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-файл с одним дополнительным столбцом для Исходный ввод с ErrorMessage на основе одного условия, где id в полезной нагрузке 1 соответствует с полем sourceInput , тогда errorMessage должен присвоить этому запрошенному полю и сгенерировать файл CSV в качестве вывода

я пробовал с помощью нижеуказанного dataweave

%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,

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Здравствуйте, лучший способ решить эту проблему - использовать groupBy. Идея заключается в том, что вы groupBy используете одну из двух частей, а затем выполняете итерацию другой части и выполняете поиск. Таким образом, вы избегаете 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 $ != null
0 голосов
/ 14 марта 2019

Предполагая, что "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])

Примечание: я также предполагаю, что поле id flowVars.action уникально для всего массива.

...