如何使用 Mulesoft 中的 Dataweave 将字符串分成定义的部分
how to divide a String into defined parts using Dataweave in Mulesoft
我有一个 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 的一些功能,但仍然没有成功
试试这个!! (更新了我之前忘记放在这里的输入和输出。那时对我来说还很早:))
输入
{
"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"
}
]
}
这是一个将字符串分成等份的函数以及我使用的一系列测试:
%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
)
您现在可以在形成您想要的结果时使用它。
这种方法可能类似于 George,您需要根据所需的长度和字符串的大小将字符串分成相等的部分。使用 pluck 生成数组并映射以遍历生成的零件数。
%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"
}
]
}
]
我有一个 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 的一些功能,但仍然没有成功
试试这个!! (更新了我之前忘记放在这里的输入和输出。那时对我来说还很早:))
输入
{
"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"
}
]
}
这是一个将字符串分成等份的函数以及我使用的一系列测试:
%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
)
您现在可以在形成您想要的结果时使用它。
这种方法可能类似于 George,您需要根据所需的长度和字符串的大小将字符串分成相等的部分。使用 pluck 生成数组并映射以遍历生成的零件数。
%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"
}
]
}
]