如何使用@json2csv/node转换器为CSV添加最终汇总行?
在@json2csv/node中添加price列汇总行
我正在使用@json2csv/node的自定义转换器,想在生成的CSV末尾添加一行,用来汇总price列的总和。
目前生成的CSV:
"carModel","price" "AUDI",0 "BMW",15 "MERCEDES",20 "PORSCHE",30 "TESLA",50
期望得到的CSV:
"carModel","price" "AUDI",0 "BMW",15 "MERCEDES",20 "PORSCHE",30 "TESLA",50 ,115
注:实际场景中转换器内还有大量其他计算,无法在调用解析器前直接添加汇总行,以下是最小可复现示例:
const { Parser } = require('@json2csv/plainjs'); const data = [ { "carModel": "Audi", "price": 0 }, { "carModel": "BMW", "price": 15000 }, { "carModel": "Mercedes", "price": 20000 }, { "carModel": "Porsche", "price": 30000 }, { "carModel": "Tesla", "price": 50000 } ]; function transformRow() { return (item) => ({ ...item, carModel: item.carModel.toUpperCase(), price: item.price / 1000, }); } try { const opts = { transforms: [transformRow()] }; const parser = new Parser(opts); const csv = parser.parse(data); console.log(csv); } catch (err) { console.error(err); }
解决方案
可以通过给自定义转换器添加postProcess钩子来实现,在钩子中汇总价格并追加到CSV末尾。修改后的代码如下:
const { Parser } = require('@json2csv/plainjs'); const data = [ { "carModel": "Audi", "price": 0 }, { "carModel": "BMW", "price": 15000 }, { "carModel": "Mercedes", "price": 20000 }, { "carModel": "Porsche", "price": 30000 }, { "carModel": "Tesla", "price": 50000 } ]; function transformWithTotal() { let totalPrice = 0; // 处理每行数据,同时累加转换后的价格 const transformRow = (item) => { const processedItem = { ...item, carModel: item.carModel.toUpperCase(), price: item.price / 1000, }; totalPrice += processedItem.price; return processedItem; }; // 所有行处理完成后执行的钩子 transformRow.postProcess = (csv) => { // 追加汇总行,保持CSV格式一致 return `${csv}\n,${totalPrice}`; }; return transformRow; } try { const opts = { transforms: [transformWithTotal()] }; const parser = new Parser(opts); const csv = parser.parse(data); console.log(csv); } catch (err) { console.error(err); }
核心说明
- 在转换器内部维护
totalPrice变量,处理每行数据时同步累加转换后的价格值 - 利用
postProcess钩子,在所有行解析完成后,将汇总行拼接到生成的CSV字符串末尾 - 汇总行格式与原CSV匹配:第一列留空,第二列填写总价,确保逗号分隔的格式正确
内容的提问来源于stack exchange,提问作者uzluisf
相关产品推荐
相关产品推荐

