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

如何使用NodeJS将CSV转换为指定结构的嵌套JSON对象?

问题描述

我正在用NodeJS的csvtojson模块把CSV转成特定结构的JSON,现在差最后一步微调。

输入CSV内容

PoHeader.hdrComment,PoHeader.poNumber,PoHeader.shipDate,PoHeader.rushOrder,PoLines.0.item,PoLines.0.itemDesc,PoLines.0.line,PoLines.0.poNumber,PoLines.0.qtyOrder
"FILL AND KILL","00100XXXXX","12/31/22","false","0000-SBAN","Henry s SFBAN Swamp Fox SFBAN",10,"00100XXXXX",1.000
"FILL AND KILL","00100XXXXX","12/31/22","false","0001-0099","Daiwa GC80 Goldcast Spincast R",20,"00100XXXXX",2.000
"FILL AND KILL","00100XXXXX","12/31/22","false","0001-1544","Daiwa MINISPIN Minispin Spinni",30,"00100XXXXX",3.000

期望的最终JSON结构

{
    "PoHeader": {
        "hdrComment": "My comment",
        "orderClass": "SO",
        "poNumber": "test02",
        "shipDate": "06/14/18",
        "rushOrder": false,
        "rushOption": 1,
        "adultSignature": true
    },
    "PoLines": [
        {
            "item": "0001-3121",
            "itemDesc": "Some item",
            "linComment": "For John Doe",
            "line": 1,
            "poNumber": "test02",
            "qtyOrder": 1
        }
    ]
}

当前转换代码

csv()
    .fromFile(csvFilePath)
    .then((jsonObj)=>{
    //console.log(jsonObj);
    sendPO(jsonObj);
})

当前问题

运行后得到的jsonObj是三个重复对象,每个都包含相同的PoHeader和单个PoLine元素。我需要的是单个对象,包含一份PoHeader和所有PoLine组成的数组,具体结构如下:

{
    PoHeader: {
      hdrComment: 'FILL AND KILL',
      poNumber: '00100XXXXX',
      shipDate: '12/31/22',
      rushOrder: 'false'
    },
    PoLines: [
      {
        item: '0000-SBAN',
        itemDesc: 'Henry s SFBAN Swamp Fox SFBAN',
        line: '10',
        poNumber: '00100XXXXX',
        qtyOrder: '1.000'
      },
      {
        item: '0001-0099',
        itemDesc: 'Daiwa GC80 Goldcast Spincast R',
        line: '20',
        poNumber: '00100XXXXX',
        qtyOrder: '2.000'
      },
      {
        item: '0001-1544',
        itemDesc: 'Daiwa MINISPIN Minispin Spinni',
        line: '30',
        poNumber: '00100XXXXX',
        qtyOrder: '3.000'
      }
    ]
  }
解决方案

在转换后的jsonObj基础上做数据聚合处理即可,步骤如下:

  1. 提取第一行的PoHeader(所有行的PoHeader内容一致)
  2. 遍历所有转换后的对象,收集每行的PoLine数据
  3. 组合成目标结构

修改后的代码如下:

csv()
    .fromFile(csvFilePath)
    .then((jsonArr)=>{
      if (!jsonArr.length) return;
      // 提取PoHeader,可按需补充默认字段
      const poHeader = {
        hdrComment: jsonArr[0]['PoHeader.hdrComment'],
        poNumber: jsonArr[0]['PoHeader.poNumber'],
        shipDate: jsonArr[0]['PoHeader.shipDate'],
        rushOrder: jsonArr[0]['PoHeader.rushOrder'] === 'false' ? false : true,
        orderClass: 'SO',
        rushOption: 1,
        adultSignature: true
      };
      // 收集所有PoLines,并转换数据类型
      const poLines = jsonArr.map(item => ({
        item: item['PoLines.0.item'],
        itemDesc: item['PoLines.0.itemDesc'],
        line: parseInt(item['PoLines.0.line'], 10),
        poNumber: item['PoLines.0.poNumber'],
        qtyOrder: parseFloat(item['PoLines.0.qtyOrder'])
      }));
      // 组合成最终结构
      const finalPO = {
        PoHeader: poHeader,
        PoLines: poLines
      };
      sendPO(finalPO);
})

说明

  • 代码里把rushOrder转成布尔值,line转整数,qtyOrder转浮点数,更贴合你期望的JSON类型
  • 若不需要默认字段(如orderClass),直接从poHeader对象中删除即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:15:30