Необходимо заполнить пользовательский индекс последовательности в столбце на основе значений в другом столбце для потока с переплетением данных в Mulesoft

#dataweave #mule4

#dataweave #mule4

Вопрос:

Мне нужно написать последовательность / индекс в столбце на основе значений в другом столбце. Пожалуйста, найдите пример ниже, чтобы объяснить мой запрос: здесь мне нужно сгенерировать значения индекса в столбце customindex на основе значений в столбце color.. таким образом, в основном, если в столбце есть 4 строки с красным цветом, тогда он должен индексировать строки как 1,2,3,4, а затем, когда его 2 строки с синим цветом в качестве значения, он должен снова индексироваться с 1 -> 1,2.

Входные данные:

 [
  {
    "Type": "Header",
    "Color": "Red",
    "Customindex": "",
"code":"H1",
    },
  {
    "Type": "Header",
    "Color": "Blue",
    "Customindex": "",
"code":"H2",
    },

  {
    "Type": "LineItem",
    "Color": "Red",
    "Customindex": "",
"code":"L1",
    },

  {
    "Type": "LineItem",
    "Color": "Red",
    "Customindex": "",
"code":"L1"
    },

  {
    "Type": "LineItem",
    "Color": "Blue",
    "Customindex": "",
"code":"L2"
    },

  {
    "Type": "Header",
    "Color": "Yellow",
    "Customindex": "",
"code":"H3"
    },

  {
    "Type": "LineItem",
    "Color": "Yellow",
    "Customindex": "",
"code":"L3"
    },
  {
    "Type": "LineItem",
    "Color": "Yellow",
    "Customindex": "",
"code":"L3"
    },
  {
    "Type": "LineItem",
    "Color": "Blue",
    "Customindex": "",
   "code":"L2"
    }
]
 

вот преобразование, с которым мне нужна помощь:

 %dw 2.0
output application/json
var TM = flatten(payload map ((item, index) ->
[{
"Type":payload.type, //HEADER VALUES
"Color":"",
"Customindex":"",
"code":"",
}]  
[{
"Type":payload.type,// LINE ITEM VALUES
"Color":payload.color,
"Customindex":index,//need the index sequence to only count similar colors
"code":"",
}]))
---
(((TM distinctBy $ ... filters and groupings
 

Образец данных с подробной информацией (ЭТО ОЖИДАЕМЫЙ РЕЗУЛЬТАТ — должен работать только для позиций):
введите описание изображения здесь

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

1. Я вижу, что задан аналогичный вопрос, и мне было интересно, добились ли вы какого-либо прогресса в предоставленном там скрипте. Если да, не могли бы вы опубликовать, как выглядит ваш последний скрипт?

2. Привет, @Salim, ваше решение сработало, но я использовал свой оригинальный подход с orderby и distinctby для своего решения. Я добавил полезную нагрузку в переменную перед разделением, и это как-то сработало (это не сработало, если я не использую переменную). Моя логика потока: разделить каждую запись на верхний и нижний колонтитулы, упорядочить все строки по ссылочному полю .. после упорядочивания строк используйте distictby header, чтобы в итоге получился один заголовок и соответствующие строки. Использовал фрагмент вашего кода для объединения массивов v.i.z «] [» и это помогло.

3. может быть, опубликовать свой последний скрипт здесь?

4. @SalimKhan это то же самое, что и в основном вопросе выше. если вы можете видеть в переменной TM, каждая запись разделена на две — 1 помечена как заголовок со значениями общих полей, 1 с позицией, которая включает столбцы с уникальными значениями. Итак, для записей -> его 10 заголовков и 10 позиций. затем я использую distinct by для удаления повторяющихся заголовков. а затем упорядочить по ссылочным полям как для заголовков, так и для строк, чтобы все строки были сгруппированы. Я использовал дополнительный входной столбец в полезной нагрузке для создания согласованной ссылки. ((TM DistinctBy $.integrationid) OrderBy $.integrationidl)

5. Избегайте задавать один и тот же точный вопрос дважды @Vineetz. Когда я попросил вас задать новый вопрос — это был вопрос, связанный с упорядочением полей.

Ответ №1:

Это работает для вас?

Ввод:

 [
    {
        "Type": "Header",
        "Color": "Red",
        "Customindex": "",
        "code": "H1"
    }, {
        "Type": "Header",
        "Color": "Blue",
        "Customindex": "",
        "code": "H2"
    },
        {
        "Type": "Header",
        "Color": "Green",
        "Customindex": "",
        "code": "H4"
    },
    {
        "Type": "LineItem",
        "Color": "Green",
        "Customindex": "",
        "code": "L4"
    },
    {
        "Type": "LineItem",
        "Color": "Green",
        "Customindex": "",
        "code": "L4"
    },
    {
        "Type": "LineItem",
        "Color": "Green",
        "Customindex": "",
        "code": "L4"
    },
    {
        "Type": "LineItem",
        "Color": "Green",
        "Customindex": "",
        "code": "L4"
    },
    {
        "Type": "LineItem",
        "Color": "Red",
        "Customindex": "",
        "code": "L1"
    },
    {
        "Type": "LineItem",
        "Color": "Red",
        "Customindex": "",
        "code": "L1"
    },
    {
        "Type": "LineItem",
        "Color": "Blue",
        "Customindex": "",
        "code": "L2"
    },
    {
        "Type": "Header",
        "Color": "Yellow",
        "Customindex": "",
        "code": "H3"
    },
    {
        "Type": "LineItem",
        "Color": "Yellow",
        "Customindex": "",
        "code": "L3"
    }, {
        "Type": "LineItem",
        "Color": "Yellow",
        "Customindex": "",
        "code": "L3"
    }, {
        "Type": "LineItem",
        "Color": "Blue",
        "Customindex": "",
        "code": "L2"
        
    }
]
 

Скрипт:

 %dw 2.0
output application/csv
fun buildHeader(code) = {
     'Type': 'Header',
      "Color": "",
      "CustomIndex":"",
      "Code":code
}

fun buildFirstLineItem(code,color,ci) = {
     'Type': 'LineItem',
      "Color": color,
      "CustomIndex":ci,
      "Code":code replace ("H") with ("L")
}
---

flatten(payload orderBy $.code groupBy $.Color mapObject {
    a: flatten($ map (
    if($.'Type' == 'Header')
     [buildHeader($.code)]   [buildFirstLineItem($.code,$.Color,(($) 1))][0]
     else
      {
      'Type': "LineItem",
      "Color": $.Color,
      "CustomIndex": (($) 1),
      "Code":$.code 
      }
      ))
 }pluck($))
 

Вывод:

 Type,Color,CustomIndex,Code
Type,Color,CustomIndex,Code
Header,,,H1
LineItem,Red,1,L1
LineItem,Red,2,L1
LineItem,Red,3,L1
Header,,,H2
LineItem,Blue,1,L2
LineItem,Blue,2,L2
LineItem,Blue,3,L2
Header,,,H3
LineItem,Yellow,1,L3
LineItem,Yellow,2,L3
LineItem,Yellow,3,L3
Header,,,H4
LineItem,Green,1,L4
LineItem,Green,2,L4
LineItem,Green,3,L4
LineItem,Green,4,L4
LineItem,Green,5,L4