Как переставить платежную нагрузку 1 с соответствующими значениями платежной нагрузки 2

#dataweave #mulesoft #mule4

#поток данных #мулсофт #муле4

Вопрос:

Я новичок в Муле и борюсь со сценарием.

Payload1 извлекается из csv-файла, а payload2-это входящая полезная нагрузка; Payload2 может содержать более одного объекта. Выходные поля должны быть расположены в соответствии с платежной нагрузкой 1 (т. е. в формате csv) с соответствующими значениями платежной нагрузки2. Сравнение должно быть выполнено во всех строчных буквах.

 payload1 = "Name,Roll Number,Standard,Name of School,Address,Marks in Maths" //this is an input from a csv file  //below is the input from different payload which is in camelcase. payload2 = [  {  "address": "Street 123",  "standard": "IV",  "marksInMaths": "90",  "rollNumber": "5",  "name": "XYZ",  "nameofSchool": "Best School" }]  

Требуемая производительность:

 [{  "Name" : "XYZ",  "Roll Number": "5",  "Standard" : "IV",  "Name of School": "Best School",   "Address": "Street 123",  "Marks in Maths": "90" }]  

Как я могу этого достичь?

Комментарии:

1. Я обнаружил некоторые проблемы при попытке сопоставить имена в CSV-файле с именами в объекте payload2. Например, Name of School легко конвертировать в nameofSchool . Но для преобразования Marks in Maths в marksInMaths логику все по-другому (если только это не опечатка). Если дело обстоит так, вам нужны где-то метаданные о сопоставлении имен.

2. привет @JorgeGarcia да, в этом и проблема; вот почему нам нужно преобразовать оба во все нижние регистры, а затем провести сравнение, только тогда это сработает

3. О, теперь я все понял. Спасибо!

Ответ №1:

Помимо сопоставления, вам нужно обратить внимание на то, как вы читаете CSV. Если вы не отключите заголовки в программе чтения CSV (атрибуты mime-типа при операции чтения), полезная нагрузка будет пустой коллекцией (поскольку у вас есть коллекция объектов без объекта, только имена полей в качестве метаданных). Другой вариант-прочитать CSV как обычный/текст, а затем использовать функцию splitBy для получения массива имен.

 %dw 2.0 output application/json  // Be aware that I disable the headers to get them as values. If not it is not possible with CSV. Another way is to read it as text and then use splitBy var payload1 = read("Name,Roll Number,Standard,Name of School,Address,Marks in Maths", "application/csv", {header: false})  var payload2 = [  {  "address": "Street 123",  "standard": "IV",  "marksInMaths": "90",  "rollNumber": "5",  "name": "XYZ",  "nameofSchool": "Best School" }]  // remove spaces and apply lowercase fun normalize(value:String) = lower(dw::core::Strings::remove(value," ")) fun normalize(value:Object) =   value mapObject ((value, key, index) -gt; {(normalize(key)): value})   var namesMap = payload1[0] mapObject (value, key, index) -gt;   (normalize(value)): value ---  payload2 map ((item, index) -gt;   do {  var normalizedItem = normalize(item)  ---  // iterate the namesMap to get the right order  namesMap mapObject ((value, key, index) -gt;   // get the key from the namesMap and look the value in the payload2's item  (value): normalizedItem[key]  )  }  

Магия заключается в создании карты имен перед отображением, поэтому ее легко создать затем.

ПРАВКА: Исходный код был неправильным. Он соответствовал только клавишам с одной строкой.

Комментарии:

1. привет @Хорхе Гарсия; спасибо за ваш ответ; однако я получаю значение null в качестве значения для некоторых в выводе;[ { «Имя»: «XYZ», «Номер рулона»: null, «Стандарт»: «IV», «Название школы»: null, «Адрес»: «Улица 123», «Отметки по математике»: null } ]

2. Я просто добавил , чтобы уменьшить регистр ключей payload2 :- var lower_payload2 = карта payload2 ((значение, ключ ) -gt; объект карты значения ( ниже ($$ )) : $ ). И в теле используется lower_payload2 вместо payload2. Это сработало. Большое вам спасибо за помощь, это сработало.

3. функция camelize() может быть полезна, если мы заменим пробелы символами подчеркивания.

4. Спасибо, что предупредил @Mule-Новичка. Я исправил код, теперь он должен работать должным образом.