【问题标题】:Ignore and log CSV row in DataWeave if condition is met如果满足条件,则忽略并记录 DataWeave 中的 CSV 行
【发布时间】:2016-07-26 17:47:36
【问题描述】:

在 DataWeave 中,如果满足条件,是否可以忽略 CSV 文件中的特定行。

我正在转换一个文件,其中一些行需要被忽略,因为列的值指示不应将特定行映射到输出。在这种情况下,我想做的是跳过该行,记录(如果可能),然后继续映射下一行。

我查看了文档,发现最接近答案的是将映射包装在 when otherwise 子句中。我找不到有关调用记录器甚至将该特定行传递给流进行处理的任何信息(因此可以记录...)

【问题讨论】:

    标签: csv mule dataweave


    【解决方案1】:

    您可以使用 dataweave 进行过滤和记录,但这需要一些额外的代码 -

    这是我的示例输入 csv -

    Name,Gender
    M1,Male
    M2,Male
    F1,Female
    F2,Female
    

    这是完整的 Mule 流程,我们将在下面详细介绍 -

     <configuration doc:name="Configuration">
         <expression-language>
             <global-functions>
                 def filterRecords(record,genderType){
                            if(record.Gender == genderType){
                                return true;
                            } else {
                                flowVars.filteredRecords.add(record);
                                return false;
                            }
    
    
                        }
    
             </global-functions>
         </expression-language>
     </configuration>
    
        <flow name="Sample_flow">
            <file:inbound-endpoint path="input" moveToDirectory="output" responseTimeout="10000" doc:name="File"/>
            <set-variable variableName="filteredRecords" value="#[[]]" doc:name="Set the "/>
            <dw:transform-message doc:name="Transform Message">
                <dw:set-payload><![CDATA[%dw 1.0
    %output application/csv header=false,separator="|"
    ---
    payload filter (filterRecords($,"Male")) map {
        Name:$.Name,
        Gender:$.Gender
    }
    ]]></dw:set-payload>
            </dw:transform-message>
            <object-to-string-transformer doc:name="Object to String"/>
            <logger message="#['Filtered Record:' + flowVars.filteredRecords]" level="INFO" doc:name="Logger"/>
            <logger message="#[payload]" level="INFO" doc:name="Logger"/>
        </flow>
    
    • 设置一个列表类型的流变量,我们将使用它来保存过滤记录。

    • 定义一个全局 MEL 函数,该函数采用记录和其他一些数据来创建条件。在示例中,filterRecords() 函数采用记录和性别类型进行过滤。这是通过在 mule-config 中添加 Configuration 元素来配置的。 Global Functions。此全局函数必须返回 true 或 false。如果 Gender 类型与我们传入的类型匹配,那么它将返回 true 以将记录包含在转换中,否则它将将该记录添加到 filteredRecords 流变量中,然后返回 false

    • 现在让我们编写一个数据编织代码来过滤和记录。下面的代码使用filter 函数过滤有效载荷。对于过滤条件,我们将调用我们刚刚创建的全局函数。对于与函数中的条件匹配的每条记录,dataweave 输出中应该有一行。

    • dataweave 转换后,我们可以访问filteredRecords 流变量来找出被过滤的记录,然后你可以对它们做任何你想做的事情。

    这是流中最后两个记录器的输出。您可以看到过滤列表包含所有女性记录,而您的有效负载即 DW 输出包含所有男性记录,因为我们过滤了男性。

    org.mule.api.processor.LoggerMessageProcessor: Filtered Record:[{Name=F1, Gender=Female}, {Name=F2, Gender=Female}]
    org.mule.api.processor.LoggerMessageProcessor: M1|Male
    M2|Male
    

    - 希望这会有所帮助,干杯!

    P.S.:谢谢你的问题,它迫使我弄清楚如何去做,因为我以前从来没有这样做过:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多