在DataWeave中,如果满足条件,是否可以忽略CSV文件中的特定行。
我正在转换一个需要忽略某些行的文件,因为列有一个值,表明不应该将某个行映射到输出。我想在这种情况下做的是跳过那一行,记录(如果可能的话),然后继续映射下一行。
我查看了文档,找到答案的最接近的是将映射包装在#define
子句中。我找不到任何关于调用记录器或甚至将该特定行传递给流程进行处理的事情(因此可以记录...)
答案 0 :(得分:1)
您可以使用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()函数将记录和genderType进行过滤。这是通过在mule-config中添加Configuration
元素来配置的。 Global Functions。此Global函数必须返回true或false。如果Gender类型与我们传入的类型匹配,那么它将返回true
以包含转换中的记录,否则它将在filteredRecords
流变量中添加该记录,然后返回false
。
现在让我们编写一个dataweave代码来过滤和记录。下面的代码使用filter
函数来过滤有效负载。对于过滤条件,我们将调用刚刚创建的全局函数。对于与函数中的条件匹配的每个记录,dataweave输出中应该有一行。
在进行数据编辑转换后,我们可以访问filteredRecords
流变量来查找已过滤的记录,然后您可以随意使用它们。
这是流程中最后两个记录器的输出。您可以看到筛选列表包含所有女性记录,而您的有效负载,即DW输出具有所有男性记录,因为我们在Male上过滤。
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。:感谢您提出这个问题,它迫使我弄明白该怎么做,因为我之前从未这样做过:)