如何在DataWeave 2.0的map中使用try函数处理CSV转换异常
处理CSV转JSON时的分组转换异常捕获方案
处理CSV转JSON时,需按订单号分组合并多行数据,但当某行字段为空或null时,整个转换流程会中断。需求是通过try函数捕获异常,将转换失败的订单单独存入错误区域,正常订单继续完成转换,不中断整体流程。
演示CSV片段
number,date,upc,quantity,price 1234556,2022-08-04,4015,1, 1234556,2022-08-04,4019,1,2.00 1234556,2022-08-04,4016,1,3.00 1234557,2022-08-04,4015,1,3.00
当前DataWeave代码
%dw 2.0 output application/json --- payload groupBy ($.number) pluck $ map ( () -> { "number": $[0].number, "date": $[0].date, "items": $ map { "upc": $.upc, "price": $.price as Number {format: "##,###.##"} as String {format: "##,###.00"}, "quantity": $.quantity } })
错误信息
Unable to coerce `` as Number using `##,###.##` as format.
注:实际场景中CSV字段众多,无法逐一校验字段有效性,需借助try函数实现异常隔离处理。
解决方案代码
%dw 2.0 output application/json --- do { // 按订单号分组所有订单行 var groupedOrders = payload groupBy $.number // 处理每个订单分组,捕获转换异常 var processedResults = groupedOrders pluck ((orderLines, orderNumber) -> try(() -> { "type": "success", "content": { "number": orderNumber, "date": orderLines[0].date, "items": orderLines map { "upc": $.upc, "price": $.price as Number {format: "##,###.##"} as String {format: "##,###.00"}, "quantity": $.quantity } } }) match { case Success(result) -> result case Failure(error) -> { "type": "error", "content": { "number": orderNumber, "message": error.error.message } } } ) // 拆分成功与失败数据,组装目标结构 { "data": processedResults filter ($.type == "success") map $.content, "Error": processedResults filter ($.type == "error") map $.content } }
代码说明
- 用
do块封装变量,提升代码可读性和逻辑模块化 - 对每个订单分组的转换逻辑用
try包裹,捕获字段转换时的异常 - 通过
match分支处理Success和Failure结果,分别标记数据类型 - 最后过滤并拆分成功/失败数据,组装成符合需求的输出结构
期望输出结果
{ "data": [ { "number": "1234557", "date": "2022-08-04", "items": [ { "upc": "4015", "price": "3.00", "quantity": "1" } ] } ], "Error": [ { "number": "1234556", "message": "Unable to coerce `` as Number using `##,###.##` as format." } ] }
内容的提问来源于stack exchange,提问作者Jesus Abraham Felix González
相关产品推荐
相关产品推荐

