#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-Новичка. Я исправил код, теперь он должен работать должным образом.