Groovy脚本转换带表头/行项/页脚的CSV为JSON的问题求助
解决扁平CSV转结构化JSON问题(表头+行项+页脚分组)
问题分析
你需要将包含表头(HEADER)、多行项目(LINE)、页脚(FOOTER)的扁平CSV转换为结构化JSON,核心要求是行项归属对应表头节点,页脚与表头节点同级且位于每个组的末尾。
正确实现代码
假设你的CSV格式如下(每行首字段标识行类型):
HEADER,ORD123,2024-05-20 LINE,ITEM001,Widget,10,25.00 LINE,ITEM002,Gadget,5,15.00 FOOTER,2,425.00 HEADER,ORD456,2024-05-21 LINE,ITEM003,Doodad,3,10.00 FOOTER,1,30.00
以下是可以实现预期结构的Groovy脚本:
@Grab('org.codehaus.groovy:groovy-all:3.0.17') import groovy.json.JsonBuilder // 读取CSV内容(实际场景可替换为new File('path/to/your.csv').text) def csvContent = '''HEADER,ORD123,2024-05-20 LINE,ITEM001,Widget,10,25.00 LINE,ITEM002,Gadget,5,15.00 FOOTER,2,425.00 HEADER,ORD456,2024-05-21 LINE,ITEM003,Doodad,3,10.00 FOOTER,1,30.00''' def orders = [] def currentOrder = null // 逐行解析CSV csvContent.split('\n').each { line -> def parts = line.split(',') switch(parts[0]) { case 'HEADER': // 遇到新表头时,创建新的订单对象并加入结果列表 currentOrder = [ header: [ orderId: parts[1], orderDate: parts[2] ], lineItems: [] ] orders.add(currentOrder) break case 'LINE': // 行项归属当前表头对应的订单 if(currentOrder) { currentOrder.lineItems.add([ itemId: parts[1], name: parts[2], quantity: parts[3].toInteger(), price: parts[4].toDouble() ]) } break case 'FOOTER': // 页脚与当前表头同级,追加到订单对象末尾 if(currentOrder) { currentOrder.footer = [ totalItems: parts[1].toInteger(), totalAmount: parts[2].toDouble() ] } break } } // 生成格式化JSON def jsonOutput = new JsonBuilder(orders).toPrettyString() println jsonOutput
预期输出
执行脚本后会得到如下结构化JSON:
[ { "header": { "orderId": "ORD123", "orderDate": "2024-05-20" }, "lineItems": [ { "itemId": "ITEM001", "name": "Widget", "quantity": 10, "price": 25.0 }, { "itemId": "ITEM002", "name": "Gadget", "quantity": 5, "price": 15.0 } ], "footer": { "totalItems": 2, "totalAmount": 425.0 } }, { "header": { "orderId": "ORD456", "orderDate": "2024-05-21" }, "lineItems": [ { "itemId": "ITEM003", "name": "Doodad", "quantity": 3, "price": 10.0 } ], "footer": { "totalItems": 1, "totalAmount": 30.0 } } ]
关键修复点
如果你的原有代码无法得到预期结果,通常是以下问题导致:
- 未维护当前关联的表头对象:没有用变量跟踪当前处理的表头组,导致行项/页脚无法正确归属。
- 类型转换缺失:数量、金额等数值字段被保留为字符串,不符合JSON结构化要求。
- 分组逻辑错误:将所有行(表头/行项/页脚)作为同级元素输出,没有按表头进行分组。
内容的提问来源于stack exchange,提问作者Arkesh Sharma
相关产品推荐
相关产品推荐

