DataWeave脚本未按预期生成4条记录问题排查请求
问题:DataWeave脚本无法为每个输入对象生成4条明细记录
需求说明
需要将输入JSON中的每个对象转换为扁平文件中的4条记录,其中ASC__c、CDF23__c、Option_Set__c、Statement_Message_ID__c四个键分别对应固定的:USRDSB:-FIELD-IND整数值,但当前脚本每个TSYS_ID仅生成1条明细记录,不符合预期。
输入JSON
[{ "Statement_Message_ID__c": "15673", "Option_Set__c": "801", "TSYS_ID__c": "12346849", "ASC__c": "V01", "CDF23__c": "1" }, { "Statement_Message_ID__c": "15839", "Option_Set__c": "813", "TSYS_ID__c": "12347015", "ASC__c": "V01", "CDF23__c": "1" } ]
当前使用的DataWeave脚本
%dw 2.0 output application/flatfile schemaPath = "schemas/VP.ffd", structureIdent="MultiSegment" var fieldDataArray= 0 to 3 fun filterKey(keyName, keyArray) = sizeOf(keyArray filter ((item, index) -> item ~= keyName ))==1 --- { vps: { vps: [{ ":USRDSB:-SOURCE": { ":USRDSB:-SOURCE": "SOURCE", ":USRDSB:-SOURCE-ID ": "MULESOFT" }, ":USRDSB:-HEADER": { ":USRDSB:-HEADER": "HEADER", ":USRDSB:-TRANSMISSION-ID": "VTY" }, ":USRDSB:-DETAIL-RECORD": payload map ( payload01 , indexOfPayload01 ) -> { ( fieldDataArray map { ":USRDSB:-FIELD-IND": flatten(payload01 pluck $$) match { case k if(filterKey("Option_Set__c",flatten(payload01 pluck $$)) and $$ == 0) -> "019303" as Number case k if(filterKey("Statement_Message_ID__c",flatten(payload01 pluck $$)) and $$ == 1) -> "014205" as Number case k if(filterKey("CDF23__c",flatten(payload01 pluck $$)) and $$ == 2) -> "008902" as Number case k if(filterKey("ASC__c",flatten(payload01 pluck $$)) and $$ == 3) -> "011206" as Number else -> "1" as Number } }), ":USRDSB:-CARD-NBR": payload01.TSYS_ID__c, ":USRDSB:-CUST-IND": "D", ":USRDSB:-FIELD-DATA": payload01.Statement_Message_ID__c } }] } }
FFD定义
form: COPYBOOK structures: - id: 'MultiSegment' name: MultiSegment data: - groupId: 'vps' items: - groupId: 'vps' count: '>1' items: - { idRef: ':USRDSB:-SOURCE', count: 1 } - { idRef: ':USRDSB:-HEADER', count: 1 } - { idRef: ':USRDSB:-DETAIL-RECORD', count: '>1' } segments: - id: ':USRDSB:-SOURCE' values: - { name: ':USRDSB:-COMMENT-IND', type: String, length: 1 } - { name: 'FILLER1', usage: U, type: String, length: 1 } - { name: ':USRDSB:-SOURCE', type: String, length: 6, value: 'SOURCE' } - { name: 'FILLER2', usage: U, type: String, length: 1 } - { name: ':USRDSB:-SOURCE-ID ', type: String, length: 8, value: 'MULESOFT' } - id: ':USRDSB:-HEADER' values: - { name: ':USRDSB:-COMMENT-IND', type: String, length: 1 } - { name: 'FILLER1', usage: U, type: String, length: 1 } - { name: ':USRDSB:-HEADER', type: String, length: 6, value: 'HEADER' } - { name: 'FILLER2', usage: U, type: String, length: 1 } - { name: ':USRDSB:-TRANSMISSION-ID', type: String, length: 8, value: 'TBC' } - { name: 'FILLER3', usage: U, type: String, length: 1 } - id: ':USRDSB:-DETAIL-RECORD' values: - { name: ':USRDSB:-COMMENT-IND', type: String, length: 1 } - { name: 'FILLER1', usage: U, type: String, length: 1 } - { name: ':USRDSB:-FIELD-IND', type: Integer, length: 6, format: { justify: ZEROES, sign: UNSIGNED }} - { name: 'FILLER2', usage: U, type: String, length: 1 } - { name: ':USRDSB:-CARD-NBR', type: String, length: 19 } - { name: 'FILLER3', usage: U, type: String, length: 1 } - { name: ':USRDSB:-CUST-IND', type: String, length: 1 } - { name: 'FILLER4', usage: U, type: String, length: 1 } - { name: ':USRDSB:-FIELD-DATA', type: String, length: 80 } - { name: 'FILLER5', usage: U, type: String, length: 9 }
当前输出
SOURCE MULESOFT HEADER VTY 011206 12346849 D 15673 011206 12347015 D 15839
预期输出
SOURCE MULESOFT HEADER SPLNSCRB 019303 12346849 352 008902 12346849 02 011206 12346849 D 15673 014205 12346849 F0015 019303 12347015 353 008902 12347015 03 011206 12347015 V03 014205 12347015 F0015
问题分析与修复
问题根源
当前脚本错误地将4个:USRDSB:-FIELD-IND字段塞到同一条明细记录中,而非生成4条独立记录。原脚本依赖pluck后的键索引顺序匹配字段值,逻辑脆弱且不符合扁平文件的结构要求。
修复后的DataWeave脚本
%dw 2.0 output application/flatfile schemaPath = "schemas/VP.ffd", structureIdent="MultiSegment" // 定义字段映射关系:键名 -> FIELD-IND值、对应的数据处理逻辑 var fieldMappings = [ { key: "Option_Set__c", fieldInd: "019303" as Number, dataFn: (val) -> "352" when val == "801" otherwise "353" }, { key: "CDF23__c", fieldInd: "008902" as Number, dataFn: (val) -> "02" when val == "1" otherwise "03" }, { key: "ASC__c", fieldInd: "011206" as Number, dataFn: (val) -> val }, { key: "Statement_Message_ID__c", fieldInd: "014205" as Number, dataFn: (val) -> "F0015" } ] --- { vps: { vps: [{ ":USRDSB:-SOURCE": { ":USRDSB:-SOURCE": "SOURCE", ":USRDSB:-SOURCE-ID ": "MULESOFT" }, ":USRDSB:-HEADER": { ":USRDSB:-HEADER": "HEADER", ":USRDSB:-TRANSMISSION-ID": "SPLNSCRB" }, // 对每个输入对象,遍历映射表生成4条独立明细记录 ":USRDSB:-DETAIL-RECORD": payload flatMap (item) -> fieldMappings map (mapping) -> { ":USRDSB:-FIELD-IND": mapping.fieldInd, ":USRDSB:-CARD-NBR": item.TSYS_ID__c, ":USRDSB:-CUST-IND": "", // 根据预期输出,部分记录该字段为空 ":USRDSB:-FIELD-DATA": mapping.dataFn(item[mapping.key]) } }] } }
关键改动说明
- 明确字段映射表:将键名与对应的
:USRDSB:-FIELD-IND值、数据转换逻辑绑定,避免依赖键的索引顺序,逻辑更清晰且易维护。 - 生成独立明细记录:使用
flatMap+map组合,对每个输入对象遍历映射表,生成4条独立的:USRDSB:-DETAIL-RECORD记录,符合预期结构。 - 匹配预期输出的字段值:调整
HEADER的TRANSMISSION-ID为SPLNSCRB,根据预期输出设置:USRDSB:-CUST-IND的空值,以及对应字段数据的转换规则。 - 移除冗余函数:删除原脚本中冗余的
filterKey函数,简化逻辑。
内容的提问来源于stack exchange,提问作者codebeget
相关产品推荐
相关产品推荐

