Dataweave处理CSV数据:过滤含/行、取resolution列高频值及qty计算
DataWeave处理CSV数据完整实现
需求说明
- 删除
number列包含/的无效行 - 按
number+join_date字段分组聚合 - 计算
avginqty/avgoutqty的非空平均值,保留qty单位 - 每个分组取
resolution列出现频率最高的值
输入样例
number,fruit,colour,join_date,avginqty,avgoutqty,resolution 282,apple,red,today,3 qty,2 qty,640*320 282,apple,red,today,3 qty,,200*200 282,apple,red,today,1 qty,,640*320 282,banana,yellow,yesterday,,, 282,banana,yellow,yesterday,1 qty,,200*200 /283,banana,yellow,yesterday,1 qty,,200*200
完整实现代码
%dw 2.0 output application/csv header=true, separator="," --- // 第一步:过滤number带/的无效行 payload filter not ($.number contains "/") // 第二步:按number+join_date分组,加下划线避免拼接歧义 groupBy ((item) -> item.number ++ "_" ++ item.join_date) mapObject ((group) => { number: group[0].number, fruit: group[0].fruit, colour: group[0].colour, join_date: group[0].join_date, // 计算平均入库量 avginqty: do { var validVals = group.avginqty filter ($ != "") map (($ replace " qty" with "") as Number) --- if(sizeOf(validVals) > 0) (avg(validVals) as String) ++ " qty" else "" }, // 计算平均出库量 avgoutqty: do { var validVals = group.avgoutqty filter ($ != "") map (($ replace " qty" with "") as Number) --- if(sizeOf(validVals) > 0) (avg(validVals) as String) ++ " qty" else "" }, // 取频率最高的分辨率 resolution: do { var validRes = group.resolution filter ($ != "") var resCount = validRes groupBy ($) pluck ((items, res) -> {res: res, count: sizeOf(items)}) var maxFreqRes = resCount orderBy (-$.count)[0].res --- maxFreqRes default "" } }) pluck $
代码说明
- 过滤逻辑:先做数据清洗排除无效行,避免脏数据参与后续计算
- Qty计算修正:补充了字符串单位提取逻辑,先把
X qty格式的内容转换为数值再求均值,避免类型报错,直接调用内置avg函数简化计算逻辑 - 最高频分辨率计算:先过滤空值,再对分辨率分组统计出现次数,按次数倒序后取第一条的分辨率值,为空时返回默认空字符串
- 输出配置:指定输出为CSV格式,保留表头、分隔符为逗号,和需求输出格式完全匹配
内容的提问来源于stack exchange,提问作者poppp
相关产品推荐
相关产品推荐

