在数据编织中拆分字符串
Split string in dataweave
我有一个像 "Hi I am from "Kazan, Russia 这样的字符串。输出应该是
Hi
I
am
from
Kazan, Russia
我尝试了正则表达式 [^\s\"']+|\"([^\"]*)\"|'([^']*)'
,它在 regexp.com 上运行良好。但在 dataweave 中它什么都不做。
这是我试过的
%dw 1.0
%output application/json
%function split(data) {returnData: data splitBy "[^\s\"']+|\"([^\"]*)\"|'([^']*)'"}
---
split(payload)[0]
编辑 1
我试过扫描运算符
这就是我做的
%dw 1.0
%output application/json
---
{
payload: payload scan /[^\s\"']+|\"([^\"]*)\"|'([^']*)'/
}
但我得到 NullPointerException
堆栈跟踪
Message : null (java.lang.NullPointerException).
Payload : com.mulesoft.weave.reader.DefaultSeekableStream@5d334a28
Element : /logFlow/processors/0 @ log:log.xml:14 (Transform Message)
Element XML : <dw:transform-message doc:name="Transform Message" metadata:id="87d4353c-240d-4b1c-84b4-171f6c11045b">
<dw:input-payload mimeType="plain/text"></dw:input-payload>
<dw:set-payload>%dw 1.0%output application/json---{payload: payload scan /[^\s\"']+|\"([^\"]*)\"|'([^']*)'/}</dw:set-payload>
</dw:transform-message>
参考 DataWeave 文档,正则表达式定义在 / 之间。因此,将双引号"替换为/。所以应该是这样的:/[^\s\"']+|\"([^\"]*)\"|'([^']*)'/
另一件事是,splitBy 将字符串拆分为单独元素的数组。所以你不会得到预期的结果。实际上,有效负载将被拆分为 5 个元素,但其内容为空。例如:"a,b,c" splitBy ","
returns 3个元素:"a" - "b" - "c",comma/separator不是结果的一部分。
要获得预期结果,请尝试使用扫描。它 returns 一个包含给定字符串中所有匹配项的数组。可能你应该相应地修改正则表达式。
使用这个表达式
%dw 1.0
%输出application/json
%var splittedValue='Hi I am from Kazan, Russia' //splitBy " "
splittedValue splitBy " "
我不确定您在初始查询中使用的语法,但以下内容应该适用于具有以下格式的有效负载:
Hello I am from "Kazan, Russia"
和:
Hello I am from "Kazan, Russia
以下示例使用:
Possessive Quantifiers 匹配所需的单词字符。
,
上的显式匹配以帮助匹配位置。
Reduce 数组的输出。
数据编织:
%dw 1.0
%input payload application/json
%output application/json
%var data = "Hello I am from \"Whosebug, Internet\""
---
data scan /\w++, \w++|\w++/ reduce ($$ ++ $)
对我有用:
%dw 2.0</p>
<h2>%输出application/json</h2>
<p>有效载荷图((payload01,indexOfPayload01)-> {
帐户类型:payload01.accountType,
地址:payload01.street++payload01.city,
国家:payload01.country,
创建日期:payload01.creationDate 为:字符串,
firstName: (payload01.name splitBy ' ')[0],
编号:payload01.accountID,
lastName: (payload01.name splitBy ' ')[1],
英里:payload01.miles,
邮政:payload01.postal
})
我通过创建一个调用 splitBy() 函数的用户定义函数在 dataweave 中实现了这一点
在下面的代码中,我在 firstname 和 last name
中从 db 解析名称 return
%dw 2.0
output application/json
fun split(data) = data splitBy (" ")
---
payload map ( payload01 , indexOfPayload01 ) -> {
id: payload01.accountID default "",
address: ((payload01.street default "") ++ (payload01.city default "")) ++ (payload01.state default ""),
postal: payload01.postal default "",
country: payload01.country default "",
creationDate: payload01.creationDate as String default "",
accountType: payload01.accountType default "",
firstName: split(payload01.name)[0],
lastName: split(payload01.name)[1],
miles: payload01.miles default 0
}
我有一个像 "Hi I am from "Kazan, Russia 这样的字符串。输出应该是
Hi
I
am
from
Kazan, Russia
我尝试了正则表达式 [^\s\"']+|\"([^\"]*)\"|'([^']*)'
,它在 regexp.com 上运行良好。但在 dataweave 中它什么都不做。
这是我试过的
%dw 1.0
%output application/json
%function split(data) {returnData: data splitBy "[^\s\"']+|\"([^\"]*)\"|'([^']*)'"}
---
split(payload)[0]
编辑 1
我试过扫描运算符
这就是我做的
%dw 1.0
%output application/json
---
{
payload: payload scan /[^\s\"']+|\"([^\"]*)\"|'([^']*)'/
}
但我得到 NullPointerException
堆栈跟踪
Message : null (java.lang.NullPointerException).
Payload : com.mulesoft.weave.reader.DefaultSeekableStream@5d334a28
Element : /logFlow/processors/0 @ log:log.xml:14 (Transform Message)
Element XML : <dw:transform-message doc:name="Transform Message" metadata:id="87d4353c-240d-4b1c-84b4-171f6c11045b">
<dw:input-payload mimeType="plain/text"></dw:input-payload>
<dw:set-payload>%dw 1.0%output application/json---{payload: payload scan /[^\s\"']+|\"([^\"]*)\"|'([^']*)'/}</dw:set-payload>
</dw:transform-message>
参考 DataWeave 文档,正则表达式定义在 / 之间。因此,将双引号"替换为/。所以应该是这样的:/[^\s\"']+|\"([^\"]*)\"|'([^']*)'/
另一件事是,splitBy 将字符串拆分为单独元素的数组。所以你不会得到预期的结果。实际上,有效负载将被拆分为 5 个元素,但其内容为空。例如:"a,b,c" splitBy ","
returns 3个元素:"a" - "b" - "c",comma/separator不是结果的一部分。
要获得预期结果,请尝试使用扫描。它 returns 一个包含给定字符串中所有匹配项的数组。可能你应该相应地修改正则表达式。
使用这个表达式
%dw 1.0 %输出application/json %var splittedValue='Hi I am from Kazan, Russia' //splitBy " "
splittedValue splitBy " "
我不确定您在初始查询中使用的语法,但以下内容应该适用于具有以下格式的有效负载:
Hello I am from "Kazan, Russia"
和:
Hello I am from "Kazan, Russia
以下示例使用:
Possessive Quantifiers 匹配所需的单词字符。
,
上的显式匹配以帮助匹配位置。Reduce 数组的输出。
数据编织:
%dw 1.0
%input payload application/json
%output application/json
%var data = "Hello I am from \"Whosebug, Internet\""
---
data scan /\w++, \w++|\w++/ reduce ($$ ++ $)
对我有用:
%dw 2.0</p>
<h2>%输出application/json</h2>
<p>有效载荷图((payload01,indexOfPayload01)-> {
帐户类型:payload01.accountType,
地址:payload01.street++payload01.city,
国家:payload01.country,
创建日期:payload01.creationDate 为:字符串,
firstName: (payload01.name splitBy ' ')[0],
编号:payload01.accountID,
lastName: (payload01.name splitBy ' ')[1],
英里:payload01.miles,
邮政:payload01.postal
})
我通过创建一个调用 splitBy() 函数的用户定义函数在 dataweave 中实现了这一点 在下面的代码中,我在 firstname 和 last name
中从 db 解析名称 return%dw 2.0
output application/json
fun split(data) = data splitBy (" ")
---
payload map ( payload01 , indexOfPayload01 ) -> {
id: payload01.accountID default "",
address: ((payload01.street default "") ++ (payload01.city default "")) ++ (payload01.state default ""),
postal: payload01.postal default "",
country: payload01.country default "",
creationDate: payload01.creationDate as String default "",
accountType: payload01.accountType default "",
firstName: split(payload01.name)[0],
lastName: split(payload01.name)[1],
miles: payload01.miles default 0
}