Node.js + fast-csv:如何修改现有CSV文件而非覆盖?
用fast-csv处理CSV的删除、修改、追加操作
嗨,作为刚接触Node.js和fast-csv的新手,我完全理解你的困惑——CSV本质是纯文本文件,并没有直接“修改”文件的API,常规做法是先把文件内容读取到内存的数组中,在数组里完成增删改操作,最后再把修改后的数组写回原文件。下面我就一步步带你实现这三个需求:
首先,确保你已经安装了fast-csv:
npm install fast-csv
假设你的CSV文件名为products.csv,内容如下(我把你示例里的|换成了标准的逗号分隔,如果你确实用|当分隔符,后面代码里要加delimiter: '|'选项):
id,minQty p1,10 p2,20 p3,30 p4,40 p5,50
1. 追加一条新记录
比如我们要追加一条id: p6, minQty: 60的记录:
const fs = require('fs'); const csv = require('fast-csv'); // 1. 读取现有CSV数据 const readStream = fs.createReadStream('products.csv'); const records = []; csv.parseStream(readStream, { headers: true }) .on('data', (data) => records.push(data)) .on('end', () => { // 2. 追加新记录 records.push({ id: 'p6', minQty: '60' }); // 注意数值可以是字符串,fast-csv会自动处理 // 3. 把修改后的数组写回文件 const writeStream = fs.createWriteStream('products.csv'); csv.write(records, { headers: true }) .pipe(writeStream) .on('finish', () => console.log('新记录追加完成!')); });
2. 修改某条记录的minQty值
比如我们要把id: p3的minQty改成35:
const fs = require('fs'); const csv = require('fast-csv'); const readStream = fs.createReadStream('products.csv'); const records = []; csv.parseStream(readStream, { headers: true }) .on('data', (data) => records.push(data)) .on('end', () => { // 找到目标记录并修改 const targetRecord = records.find(item => item.id === 'p3'); if (targetRecord) { targetRecord.minQty = '35'; // 这里可以用数字,但写入时会转成字符串,所以直接写字符串也没问题 } // 写回文件 const writeStream = fs.createWriteStream('products.csv'); csv.write(records, { headers: true }) .pipe(writeStream) .on('finish', () => console.log('记录修改完成!')); });
3. 删除一条记录
比如我们要删除id: p2的记录:
const fs = require('fs'); const csv = require('fast-csv'); const readStream = fs.createReadStream('products.csv'); const records = []; csv.parseStream(readStream, { headers: true }) .on('data', (data) => records.push(data)) .on('end', () => { // 过滤掉要删除的记录 const updatedRecords = records.filter(item => item.id !== 'p2'); // 写回文件 const writeStream = fs.createWriteStream('products.csv'); csv.write(updatedRecords, { headers: true }) .pipe(writeStream) .on('finish', () => console.log('记录删除完成!')); });
额外提示
- 如果你的CSV是用
|分隔的,在调用csv.parseStream和csv.write的时候要加上delimiter: '|'选项,比如:csv.parseStream(readStream, { headers: true, delimiter: '|' }) // 写入时也要加 csv.write(records, { headers: true, delimiter: '|' }) - 实际项目中建议加上错误处理,比如监听
error事件:readStream.on('error', (err) => console.error('读取文件出错:', err)); writeStream.on('error', (err) => console.error('写入文件出错:', err));
内容的提问来源于stack exchange,提问作者ngchongpeng
相关产品推荐
相关产品推荐

