如果满足条件,则忽略并记录 DataWeave 中的 CSV 行

Ignore and log CSV row in DataWeave if condition is met

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

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

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

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

这是我的示例输入 csv -

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

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

 <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。此全局函数必须 return true 或 false。如果性别类型与我们传入的匹配,那么它将 return true 用于在转换中包含记录,否则它将将该记录添加到 filteredRecords 流变量中,然后 return 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.: 谢谢你的问题,它迫使我弄清楚如何去做,因为我以前从未做过:)