Node.js读取CSV文件:逐行生成新文件并删除行的实现咨询
解决CSV逐行生成文件并移除原行的需求
我来帮你完善现有代码,实现读取CSV每行内容生成独立文件,同时把该行从原CSV中移除的功能。先给你完整的可运行代码,再拆解关键细节:
完整实现代码
var fs = require("fs"); var glob = require("glob"); var path = require("path"); // 封装处理单个CSV文件的函数 function processCsv(csvPath) { fs.readFile(csvPath, "utf8", (err, rawData) => { if (err) { console.error("读取CSV时出错:", err); return; } // 分割行:兼容Windows(\r\n)和Unix(\n)换行,同时过滤空行 let allLines = rawData.split(/\r?\n/).filter(line => line.trim() !== ""); if (allLines.length === 0) { console.log("这个CSV里没有有效内容,不用处理啦"); return; } // 取出第一行来处理(每次处理一行,循环直到完成) const targetLine = allLines.shift(); // 生成唯一的新文件名,这里用时间戳保证不重复,你也可以换成行内的唯一ID const newFile = path.join(__dirname, `processed_line_${Date.now()}.txt`); // 先把当前行写入新文件 fs.writeFile(newFile, targetLine, "utf8", (writeErr) => { if (writeErr) { console.error(`生成文件${newFile}失败:`, writeErr); return; } console.log(`✅ 已生成文件: ${newFile}`); // 把剩下的行写回原CSV,完成该行的移除 fs.writeFile(csvPath, allLines.join("\n"), "utf8", (updateErr) => { if (updateErr) { console.error("更新原CSV失败:", updateErr); return; } console.log("✅ 原CSV已移除当前行"); // 如果还有剩余行,继续处理下一行 if (allLines.length > 0) { processCsv(csvPath); } else { console.log("🎉 所有行都处理完成啦!"); } }); }); }); } // 找到目标CSV并启动处理 glob.sync(path.join(__dirname, "Database.csv")).forEach(csvFilename => { // 跳过_new结尾的CSV,避免重复处理 if (!/(_new\.csv$)/.test(csvFilename)) { processCsv(csvFilename); } });
关键细节说明
- 换行兼容:用
split(/\r?\n/)处理不同系统的换行符,同时过滤空行,避免无效操作。 - 异步顺序控制:Node.js文件操作是异步的,所以必须等新文件写入成功后,再更新原CSV,防止数据混乱或丢失。
- 递归逐行处理:每次处理完一行后,如果还有剩余内容,递归调用处理函数,实现逐行处理直到所有行完成。
- 文件名唯一性:示例用
Date.now()生成唯一文件名,你可以根据需求替换成更贴合业务的命名(比如用行内的用户ID、订单号等)。
额外提醒
如果你的CSV包含带换行符的字段(比如用双引号包裹的多行文本),上面的简单行分割会出错。这种情况建议用专业的CSV解析库,比如papaparse或csv-parser,它们能正确解析复杂CSV结构。另外,操作前记得备份原CSV,防止意外数据丢失哦!
内容的提问来源于stack exchange,提问作者Bharat Paudyal
相关产品推荐
相关产品推荐

