从 XML 映射到 CSV 循环值由下划线分隔
Mapping from XML to CSV loop over values separated by underscore
<tXML>
<Header>
<Source>J1_RETAIL</Source>
<Action_Type>Update</Action_Type>
<Sequence_Number>0</Sequence_Number>
<Batch_ID>4383352</Batch_ID>
<Reference_ID>04381645</Reference_ID>
<User_ID>SAP</User_ID>
<Password>password</Password>
<Message_Type>SAP_DO</Message_Type>
<Company_ID>J1</Company_ID>
<Msg_Locale>English (United States)</Msg_Locale>
<Msg_Time_Zone>Eastern Standard Time</Msg_Time_Zone>
<Version></Version>
<Internal_Reference_ID></Internal_Reference_ID>
<Internal_Date_Time_Stamp></Internal_Date_Time_Stamp>
<External_Reference_ID></External_Reference_ID>
<External_Date_Time_Stamp></External_Date_Time_Stamp>
</Header>
<Message>
<DistributionOrder>
<ProcessInfo>
<RefTextField1></RefTextField1>
<RefTextField2></RefTextField2>
<RefTextField3>S082</RefTextField3>
<RefTextField4></RefTextField4>
<RefTextField5></RefTextField5>
<RefTextField6></RefTextField6>
<RefTextField7>J1</RefTextField7>
<RefTextField8>[0001333006_SAPTOMIF]</RefTextField8>
<RefTextField9></RefTextField9>
<RefTextField10>[ _20191223]</RefTextField10>
<RefNumberField1>20191220</RefNumberField1>
<RefNumberField2>34621</RefNumberField2>
<RefNumberField3></RefNumberField3>
<RefNumberField4>53</RefNumberField4>
<RefNumberField5>13</RefNumberField5>
</ProcessInfo>
<Comment>
<NoteType>MB</NoteType>
<NoteCode>05</NoteCode>
<CommentText>[00000_ _ _ _ _ _ _ ]</CommentText>
<Visibility>0</Visibility>
</Comment>
<CustomFieldList>
<CustomField>
<Name>SiteID</Name>
<Value></Value>
</CustomField>
<LineItem>
<DoLineNbr>1</DoLineNbr>
<ItemName>135465</ItemName>
<Description>A</Description>
<UpdateActionType></UpdateActionType>
<PackageType></PackageType>
<DoLineStatus>Released</DoLineStatus>
<InventoryAttributes>
<InventoryType>F</InventoryType>
<ProductStatus></ProductStatus>
<BatchNbr></BatchNbr>
<CountryOfOrigin></CountryOfOrigin>
<ItemAttribute1>R</ItemAttribute1>
<ItemAttribute2></ItemAttribute2>
<ItemAttribute3></ItemAttribute3>
<ItemAttribute4></ItemAttribute4>
<ItemAttribute5></ItemAttribute5>
</InventoryAttributes>
<Comment>
<NoteType>MB</NoteType>
<NoteCode>20</NoteCode>
<CommentText>[JPY_ _Mens_ _ _ _ _ _ _ _ _ _ _ ]</CommentText>
<Visibility>0</Visibility>
</Comment>
<Comment>
<NoteType>MB</NoteType>
<NoteCode>13</NoteCode>
<CommentText>[ _00016000.00000_.00000_.00000_ _ _ _ _ _ _ _ ]</CommentText>
<Visibility>0</Visibility>
</Comment>
<Comment>
<NoteType>SC</NoteType>
<NoteCode>02</NoteCode>
<CommentText>[ _ _ _ _R]</CommentText>
<Visibility>0</Visibility>
</Comment>
</LineItem>
</DistributionOrder>
</Message>
</tXML>
我正在将以上 XMl 映射到 CSV 管道分隔格式,需要有关如何循环和打印 CommentText 值的帮助。
我的代码是这样的
output application/csv header = false , separator = "|" , quoteValues = false
---
payload.tXML.Message.*DistributionOrder map ((DistributionOrder , indexofDistributionOrder) -> {
column_1: "000000001",
column_2: "0",
column_3: "0",
column_4: (LineItem.LineProcessInfo.LineRefTextField2 splitBy "_")[0] replace "[" with "" default "",
column_5: (LineItem.LineProcessInfo.LineRefTextField2 splitBy "_")[1] replace "[" with "" default "",
column_6: ????
column_7: "",
column_8: "",
column_9: "",
column_10: "",
})
在上面的代码中,我需要检查条件 if NoteType = MB and NoteCode =05
并且我必须遍历每个评论文本并在 DistributionOrder 下获取值
[00000_ 1_2_3_4_5_6_7]
我需要在每一行中放入每个值(例如 1,2,3...7)。
00000001|0001333006|20191220|34621|SAPTOMIF4|CommentText1|||6500055464123|252||J1||||MW09449|
00000001|0001333006|20191220|34621|SAPTOMIF4|CommentText2|||6500055464123|252||J1||||MW09449|
00000001|0001333006|20191220|34621|SAPTOMIF4|CommentText3|||6500055464123|252||J1||||MW09449|
00000001|0001333006|20191220|34621|SAPTOMIF6|CommentText4|||6500055654123|4542||J1||||MW09449|
00000001|0001333006|20191220|34621|SAPTOMIF6|CommentText5|||6500055654123|4542||J1||||MW09449|
00000001|0001333006|20191220|34621|SAPTOMIF6|CommentText6|||6500055654123|4542||J1||||MW09449|
00000001|0001333006|20191220|34621|SAPTOMIF6|CommentText7|||6500055654123|4542||J1||||MW09449|
下面的代码将结合使用 flatMap(而不是 map 和 flatten)和 splitBy
%dw 2.0
output application/csv header = false , separator = "|" , quoteValues = false
var payload = read("<tXML>
<Message>
<DistributionOrder>
<LineItem>
<Comment>
<NoteType>MB</NoteType>
<NoteCode>20</NoteCode>
<CommentText>[JPY_ _Mens_ _ _ _ _ _ _ _ _ _ _ ]</CommentText>
<Visibility>0</Visibility>
</Comment>
<Comment>
<NoteType>MB</NoteType>
<NoteCode>13</NoteCode>
<CommentText>[ _00016000.00000_.00000_.00000_ _ _ _ _ _ _ _ ]</CommentText>
<Visibility>0</Visibility>
</Comment>
</LineItem>
<LineItem>
<Comment>
<NoteType>MB</NoteType>
<NoteCode>20</NoteCode>
<CommentText>[JPY_ _Mens_ _ _ _ _ _ _ _ _ _ _ ]</CommentText>
<Visibility>0</Visibility>
</Comment>
<Comment>
<NoteType>MB</NoteType>
<NoteCode>13</NoteCode>
<CommentText>[ _00016000.00000_.00000_.00000_ _ _ _ _ _ _ _ ]</CommentText>
<Visibility>0</Visibility>
</Comment>
<Comment>
<NoteType>SC</NoteType>
<NoteCode>02</NoteCode>
<CommentText>[ _ _ _ _R]</CommentText>
<Visibility>0</Visibility>
</Comment>
<Comment>
<NoteType>MB</NoteType>
<NoteCode>05</NoteCode>
<CommentText>1_2_3_4_ _6</CommentText>
<Visibility>0</Visibility>
</Comment>
</LineItem>
</DistributionOrder>
</Message>
</tXML>", "application/xml")
fun outputMap (LineItem, column6="") =
{
column_1: "000000001",
column_2: "0",
column_3: "0",
column_4: (LineItem.LineProcessInfo.LineRefTextField2 splitBy "_")[0] replace "[" with "" default "",
column_5: (LineItem.LineProcessInfo.LineRefTextField2 splitBy "_")[1] replace "[" with "" default "",
column_6: column6 default "",
column_7: "",
column_8: "",
column_9: "",
column_10: ""
}
---
payload.tXML.Message.DistributionOrder.*LineItem flatMap (LineItem) ->
using (filteredComment = LineItem.*Comment[?($.NoteType == "MB" and $.NoteCode == "05")])
if (filteredComment != null)
filteredComment flatMap(commentObject) ->
using (splitCommentText = commentObject.CommentText splitBy /_/)
splitCommentText flatMap (commentText) -> outputMap(LineItem, commentText)
else
outputMap(LineItem)
这将导致
000000001|0|0|||||||
000000001|0|0|||1||||
000000001|0|0|||2||||
000000001|0|0|||3||||
000000001|0|0|||4||||
000000001|0|0||| ||||
000000001|0|0|||6||||
请注意,我已更新负载以根据给定条件显示评论。上述代码序列将循环遍历 LineItems -> 在给定条件下选择评论 -> 循环遍历所选评论 -> 拆分评论文本 -> 迭代结果数组。我在这里添加了一个 if else 语句来检查 selected/filtered 评论对象是否存在。
更新:
splitCommentText[?($$>0)] flatMap (commentText) -> outputMap(LineItem, commentText)
添加了过滤器以仅考虑索引 > 0 的值。
<tXML>
<Header>
<Source>J1_RETAIL</Source>
<Action_Type>Update</Action_Type>
<Sequence_Number>0</Sequence_Number>
<Batch_ID>4383352</Batch_ID>
<Reference_ID>04381645</Reference_ID>
<User_ID>SAP</User_ID>
<Password>password</Password>
<Message_Type>SAP_DO</Message_Type>
<Company_ID>J1</Company_ID>
<Msg_Locale>English (United States)</Msg_Locale>
<Msg_Time_Zone>Eastern Standard Time</Msg_Time_Zone>
<Version></Version>
<Internal_Reference_ID></Internal_Reference_ID>
<Internal_Date_Time_Stamp></Internal_Date_Time_Stamp>
<External_Reference_ID></External_Reference_ID>
<External_Date_Time_Stamp></External_Date_Time_Stamp>
</Header>
<Message>
<DistributionOrder>
<ProcessInfo>
<RefTextField1></RefTextField1>
<RefTextField2></RefTextField2>
<RefTextField3>S082</RefTextField3>
<RefTextField4></RefTextField4>
<RefTextField5></RefTextField5>
<RefTextField6></RefTextField6>
<RefTextField7>J1</RefTextField7>
<RefTextField8>[0001333006_SAPTOMIF]</RefTextField8>
<RefTextField9></RefTextField9>
<RefTextField10>[ _20191223]</RefTextField10>
<RefNumberField1>20191220</RefNumberField1>
<RefNumberField2>34621</RefNumberField2>
<RefNumberField3></RefNumberField3>
<RefNumberField4>53</RefNumberField4>
<RefNumberField5>13</RefNumberField5>
</ProcessInfo>
<Comment>
<NoteType>MB</NoteType>
<NoteCode>05</NoteCode>
<CommentText>[00000_ _ _ _ _ _ _ ]</CommentText>
<Visibility>0</Visibility>
</Comment>
<CustomFieldList>
<CustomField>
<Name>SiteID</Name>
<Value></Value>
</CustomField>
<LineItem>
<DoLineNbr>1</DoLineNbr>
<ItemName>135465</ItemName>
<Description>A</Description>
<UpdateActionType></UpdateActionType>
<PackageType></PackageType>
<DoLineStatus>Released</DoLineStatus>
<InventoryAttributes>
<InventoryType>F</InventoryType>
<ProductStatus></ProductStatus>
<BatchNbr></BatchNbr>
<CountryOfOrigin></CountryOfOrigin>
<ItemAttribute1>R</ItemAttribute1>
<ItemAttribute2></ItemAttribute2>
<ItemAttribute3></ItemAttribute3>
<ItemAttribute4></ItemAttribute4>
<ItemAttribute5></ItemAttribute5>
</InventoryAttributes>
<Comment>
<NoteType>MB</NoteType>
<NoteCode>20</NoteCode>
<CommentText>[JPY_ _Mens_ _ _ _ _ _ _ _ _ _ _ ]</CommentText>
<Visibility>0</Visibility>
</Comment>
<Comment>
<NoteType>MB</NoteType>
<NoteCode>13</NoteCode>
<CommentText>[ _00016000.00000_.00000_.00000_ _ _ _ _ _ _ _ ]</CommentText>
<Visibility>0</Visibility>
</Comment>
<Comment>
<NoteType>SC</NoteType>
<NoteCode>02</NoteCode>
<CommentText>[ _ _ _ _R]</CommentText>
<Visibility>0</Visibility>
</Comment>
</LineItem>
</DistributionOrder>
</Message>
</tXML>
我正在将以上 XMl 映射到 CSV 管道分隔格式,需要有关如何循环和打印 CommentText 值的帮助。
我的代码是这样的
output application/csv header = false , separator = "|" , quoteValues = false
---
payload.tXML.Message.*DistributionOrder map ((DistributionOrder , indexofDistributionOrder) -> {
column_1: "000000001",
column_2: "0",
column_3: "0",
column_4: (LineItem.LineProcessInfo.LineRefTextField2 splitBy "_")[0] replace "[" with "" default "",
column_5: (LineItem.LineProcessInfo.LineRefTextField2 splitBy "_")[1] replace "[" with "" default "",
column_6: ????
column_7: "",
column_8: "",
column_9: "",
column_10: "",
})
在上面的代码中,我需要检查条件 if NoteType = MB and NoteCode =05
并且我必须遍历每个评论文本并在 DistributionOrder 下获取值
[00000_ 1_2_3_4_5_6_7]
我需要在每一行中放入每个值(例如 1,2,3...7)。
00000001|0001333006|20191220|34621|SAPTOMIF4|CommentText1|||6500055464123|252||J1||||MW09449|
00000001|0001333006|20191220|34621|SAPTOMIF4|CommentText2|||6500055464123|252||J1||||MW09449|
00000001|0001333006|20191220|34621|SAPTOMIF4|CommentText3|||6500055464123|252||J1||||MW09449|
00000001|0001333006|20191220|34621|SAPTOMIF6|CommentText4|||6500055654123|4542||J1||||MW09449|
00000001|0001333006|20191220|34621|SAPTOMIF6|CommentText5|||6500055654123|4542||J1||||MW09449|
00000001|0001333006|20191220|34621|SAPTOMIF6|CommentText6|||6500055654123|4542||J1||||MW09449|
00000001|0001333006|20191220|34621|SAPTOMIF6|CommentText7|||6500055654123|4542||J1||||MW09449|
下面的代码将结合使用 flatMap(而不是 map 和 flatten)和 splitBy
%dw 2.0
output application/csv header = false , separator = "|" , quoteValues = false
var payload = read("<tXML>
<Message>
<DistributionOrder>
<LineItem>
<Comment>
<NoteType>MB</NoteType>
<NoteCode>20</NoteCode>
<CommentText>[JPY_ _Mens_ _ _ _ _ _ _ _ _ _ _ ]</CommentText>
<Visibility>0</Visibility>
</Comment>
<Comment>
<NoteType>MB</NoteType>
<NoteCode>13</NoteCode>
<CommentText>[ _00016000.00000_.00000_.00000_ _ _ _ _ _ _ _ ]</CommentText>
<Visibility>0</Visibility>
</Comment>
</LineItem>
<LineItem>
<Comment>
<NoteType>MB</NoteType>
<NoteCode>20</NoteCode>
<CommentText>[JPY_ _Mens_ _ _ _ _ _ _ _ _ _ _ ]</CommentText>
<Visibility>0</Visibility>
</Comment>
<Comment>
<NoteType>MB</NoteType>
<NoteCode>13</NoteCode>
<CommentText>[ _00016000.00000_.00000_.00000_ _ _ _ _ _ _ _ ]</CommentText>
<Visibility>0</Visibility>
</Comment>
<Comment>
<NoteType>SC</NoteType>
<NoteCode>02</NoteCode>
<CommentText>[ _ _ _ _R]</CommentText>
<Visibility>0</Visibility>
</Comment>
<Comment>
<NoteType>MB</NoteType>
<NoteCode>05</NoteCode>
<CommentText>1_2_3_4_ _6</CommentText>
<Visibility>0</Visibility>
</Comment>
</LineItem>
</DistributionOrder>
</Message>
</tXML>", "application/xml")
fun outputMap (LineItem, column6="") =
{
column_1: "000000001",
column_2: "0",
column_3: "0",
column_4: (LineItem.LineProcessInfo.LineRefTextField2 splitBy "_")[0] replace "[" with "" default "",
column_5: (LineItem.LineProcessInfo.LineRefTextField2 splitBy "_")[1] replace "[" with "" default "",
column_6: column6 default "",
column_7: "",
column_8: "",
column_9: "",
column_10: ""
}
---
payload.tXML.Message.DistributionOrder.*LineItem flatMap (LineItem) ->
using (filteredComment = LineItem.*Comment[?($.NoteType == "MB" and $.NoteCode == "05")])
if (filteredComment != null)
filteredComment flatMap(commentObject) ->
using (splitCommentText = commentObject.CommentText splitBy /_/)
splitCommentText flatMap (commentText) -> outputMap(LineItem, commentText)
else
outputMap(LineItem)
这将导致
000000001|0|0|||||||
000000001|0|0|||1||||
000000001|0|0|||2||||
000000001|0|0|||3||||
000000001|0|0|||4||||
000000001|0|0||| ||||
000000001|0|0|||6||||
请注意,我已更新负载以根据给定条件显示评论。上述代码序列将循环遍历 LineItems -> 在给定条件下选择评论 -> 循环遍历所选评论 -> 拆分评论文本 -> 迭代结果数组。我在这里添加了一个 if else 语句来检查 selected/filtered 评论对象是否存在。
更新:
splitCommentText[?($$>0)] flatMap (commentText) -> outputMap(LineItem, commentText)
添加了过滤器以仅考虑索引 > 0 的值。