как разделить строку на определенные части с помощью Dataweave в Mulesoft

#dataweave #mule4

#dataweave #mule4

Вопрос:

У меня есть объект JSON, как показано ниже

 {
 "a" : "ABCDEFGHIJKL",
 "b" : "B"
}
 

здесь каждое поле содержит строку (все они имеют разные размеры), мне нужно разделить каждое значение поля (т.Е. Строку) на 4, а затем сделать его отдельным массивом объектов JSON и присвоить его новому полю
Итак, мой ожидаемый o / p здесь выглядит так, как показано ниже

 [{
        "label": "a",
        "value": [{
                "Line": "ABCD"
            },
            {
                "Line": "EFGH"
            },
            {
                "Line": "IJKL"
            }
        ]
    },
    {
        "label": "b",
        "value": [{
            "Line": "B"
        }]
    }
]
 

Я использую mule4, я пытался использовать какую-то функцию Dataweave, но по-прежнему безуспешно

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

1. Что определяет равные части в соответствии с их размером?

2. привет, @Salim отредактировал вопрос, мне нужно создать группу из 4, если это невозможно, тогда очевидно, что меньше 4, как в моем ожидаемом o / p для поля «b», поскольку там был размер строки 1

Ответ №1:

Попробуйте это сделать!! (Обновлен ввод и вывод, которые я забыл поместить здесь ранее. Довольно рано для меня на тот момент :))

Ввод

 {
 "a": "YHTUJLOKIYTRUYT", 
 "b": "ERF",
 "c": "ABCDEFGHIJKLMONP",
 "d": "AVBGTRETYU",
 "e": "ABGTIOU",
 "f": "",
 "g": "E"
}
 

Скрипт

 %dw 2.0
output application/json
var divideBy=4
fun returnStringParts(val :String, iteration :Number, size :Number) = {
    result:  if((sizeOf(val) - (iteration*size)) > 0 )val  [((iteration -1)*size) to (iteration*size)-1]  else val [(iteration-1)*size to -1]
}
---
payload mapObject  (value,key,index) -> {
    "label": (key),
    "value" : if (sizeOf(value) > divideBy)  ((1 to (ceil((sizeOf(value)/divideBy )))) map {
        "Line": returnStringParts(value,$,divideBy).result
    }) 
    else
    {
       temp: [{
            "Line": value
        }]
    }.temp
}
 

Вывод

 {
  "label": "a",
  "value": [
    {
      "Line": "YHTU"
    },
    {
      "Line": "JLOK"
    },
    {
      "Line": "IYTR"
    },
    {
      "Line": "UYT"
    }
  ],
  "label": "b",
  "value": [
    {
      "Line": "ERF"
    }
  ],
  "label": "c",
  "value": [
    {
      "Line": "ABCD"
    },
    {
      "Line": "EFGH"
    },
    {
      "Line": "IJKL"
    },
    {
      "Line": "MONP"
    }
  ],
  "label": "d",
  "value": [
    {
      "Line": "AVBG"
    },
    {
      "Line": "TRET"
    },
    {
      "Line": "YU"
    }
  ],
  "label": "e",
  "value": [
    {
      "Line": "ABGT"
    },
    {
      "Line": "IOU"
    }
  ],
  "label": "f",
  "value": [
    {
      "Line": ""
    }
  ],
  "label": "g",
  "value": [
    {
      "Line": "E"
    }
  ]
}
 

Ответ №2:

Вот функция, которая разбивает строку на равные части вместе с кучей тестов, которые я использовал:

 %dw 2.0
output application/dw

var tests = [
    "ABCDEFGHIJKLMNOPSQ",
    "A",
    "ABC",
    "",
    "ABCDEFGH",
    "ABCD"
]
fun eqPartsOf(s: String, p: Number) = s match {
    case "" -> [""]
    else -> do {
        var parts = if ((sizeOf(s) mod p) == 0) (sizeOf(s) / p - 1) else (sizeOf(s) / p)
        ---
        0 to parts map (
            (s[($ * p) to ($ * p   p - 1)]) default (s[($ * p) to -1])
        )       
    }
}

---
tests map (
    $ eqPartsOf 4
)
 

Теперь вы можете использовать его при формировании желаемого результата.

Ответ №3:

Этот подход может быть похож на George, где вам нужно разбить строку на равные части в зависимости от желаемой длины и размера строки. Использование pluck для преобразования в массив и map для перебора результирующего количества частей.

 %dw 2.0
output application/json

var payload = {
 "a" : "ABCDEFGHIJKL",
 "b" : "B"
}

var length = 4

---
payload pluck (value, key) -> 
    using (totalLength = sizeOf(value),
           arrayMaxCount =  if (totalLength >= length) ceil((totalLength / length) - 1)
                            else 0
    )
    {
        "label" : key,
        "value" : (0 to arrayMaxCount) map (innerValue) -> 
        using ( innerMinIndex = innerValue * length,
                innerMaxIndex  = if (totalLength - (innerMinIndex   length - 1) >= 0) innerMinIndex   length - 1
                                 else totalLength - 1
        )
        {
            "Line" : value[innerMinIndex to innerMaxIndex]
        }
    }
 

Это приведет к:

 [
  {
    "label": "a",
    "value": [
      {
        "Line": "ABCD"
      },
      {
        "Line": "EFGH"
      },
      {
        "Line": "IJKL"
      }
    ]
  },
  {
    "label": "b",
    "value": [
      {
        "Line": "B"
      }
    ]
  }
]