使用Fast-CSV导入MySQL前修改CSV指定列数据遇阻
问题根源
你的代码有两个核心问题导致列值没被修改:
transform方法没返回修改后的对象,处理后的数据根本没被保留;- 最后还是直接导入原CSV文件——
csv.parseFile只是在内存里处理数据,没修改原文件,MySQL读的还是原始内容,等于之前的处理白做了。
修复代码
第一步:修正transform逻辑
transform必须返回修改后的完整数据对象,不然处理不会生效:
.transform(function(data) { // 替换目标列的值,键名要和表头处理后的名称一致 data.partyIdentification = getPartyID(data.partyIdentification); // 必须return,不然数据不会往下传递 return data; })
第二步:把处理后的数据存成新文件再导入
csv.parseFile是流式处理,得把处理好的数据写入新CSV文件,再让MySQL读取这个新文件。用csv.stringify配合文件流实现:
完整代码示例:
const csv = require('csv'); const fs = require('fs'); const path = require('path'); // 生成处理后的临时文件路径 const processedFilePath = path.join(path.dirname(req.file.path), `processed_${req.file.filename}`); csv.parseFile(req.file.path, { headers: headers => headers.map(header => { // 清理表头的空格和冒号 return header.replaceAll(" ", "").replaceAll(":", ""); }), delimiter: '|' }) .transform(function(data) { // 提取c对应的值,替换原列内容 data.partyIdentification = getPartyID(data.partyIdentification); return data; }) // 把处理后的数据转成竖线分隔的CSV格式 .pipe(csv.stringify({ header: true, delimiter: '|' })) // 写入临时文件 .pipe(fs.createWriteStream(processedFilePath)) .on("finish", function () { // 导入临时文件到MySQL(替换成实际表名) query(`LOAD DATA LOCAL INFILE '${processedFilePath}' INTO TABLE your_table_name FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n' IGNORE 1 ROWS;`) .then(() => { console.log('导入成功'); // 可选:导入完成后删除临时文件,避免磁盘占用 fs.unlinkSync(processedFilePath); }) .catch(err => console.error('导入失败:', err)); }) .on("error", err => console.error('处理CSV出错:', err)); function getPartyID(str) { if (str === undefined) return ""; const split = str.split(","); const value = split.find(val => val.includes("c")); return value ? value.split(":")[1].trim() : ""; }
注意事项
- 将代码中的
your_table_name替换为实际的MySQL表名; - 直接拼接文件路径到SQL语句存在注入风险,如果使用mysql2等支持参数化查询的驱动,建议改用参数化方式;
- 临时文件可根据需求选择是否保留,不需要的话导入完成后删除即可。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

