You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
        }
    }
]

关键修复点

如果你的原有代码无法得到预期结果,通常是以下问题导致:

  1. 未维护当前关联的表头对象:没有用变量跟踪当前处理的表头组,导致行项/页脚无法正确归属。
  2. 类型转换缺失:数量、金额等数值字段被保留为字符串,不符合JSON结构化要求。
  3. 分组逻辑错误:将所有行(表头/行项/页脚)作为同级元素输出,没有按表头进行分组。

内容的提问来源于stack exchange,提问作者Arkesh Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 14:05:16