【问题标题】:Mapping from XML to CSV loop over values separated by underscore从 XML 映射到 CSV 循环遍历由下划线分隔的值
【发布时间】:2020-04-30 09:15:01
【问题描述】:
<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|

【问题讨论】:

  • 您可以使用 splitBy 根据某个参数拆分值。这将产生一个数组,您可以在其中再次迭代。在相关说明中,如果您只想根据您的条件选择特定的评论对象,您可以使用带有过滤器的数据选择器。
  • 您是否介意展示一个示例或使用 splitBy 对此 CommentText [00000_ 1_2_3_4_5_6_7]
  • 在下面查看我的答案。

标签: dataweave mulesoft mule4


【解决方案1】:

下面的代码将使用 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||||

请注意,我已更新有效负载以根据给定条件显示 cmets。上述代码的序列将循环通过 LineItems -> 选择给定条件的 cmets -> 循环通过选定的 cmets -> 拆分注释文本 -> 遍历结果数组。我在这里添加了一个 if else 语句来检查选择/过滤的评论对象是否存在。

更新:

splitCommentText[?($$>0)] flatMap (commentText) -> outputMap(LineItem, commentText)

添加过滤器以仅考虑索引 > 0 的值。

【讨论】:

  • 感谢您的快速响应只是一个小的更正,如果 CommentText 的值看起来像这样 1_2_3_4_ 5_6 如果我想从第二个元素开始选择值(例如从 2 到 6)
  • 对于 Column_7 :条件是(如果存在 CommentText,例如 a_b_c_d_e_f_g 则打印 '01' 并在存在时增加)。在我们将它转​​换为 Array 之后,我们可以检查 CommentText 的值是否存在,例如 a 或 ab 或 c 并从 01 开始分配增量值
  • 您可以使用数据选择器的过滤器或范围来仅考虑索引 > 1 中的值。请参阅docs.mulesoft.com/mule-runtime/4.2/dataweave-selectors
  • 上述解决方案可以应用 index >1 吗?
  • 谢谢oim :)
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 2021-11-22
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多