如何在Node.js中检测Excel无效时间并将错误写入文件?
问题与代码优化
需求说明
处理包含No、itemCode、startAt、endAt列的CSV文件(注:代码使用csv-parser,对应CSV文件而非Excel),通过createReadStream遍历数据,检测startAt晚于endAt的无效时间记录,并将错误信息写入test.txt文件。
当前代码存在的问题
csvResults未声明,运行时会抛出ReferenceError- 每次检测到错误都创建新的
fs.createWriteStream,默认覆盖模式会丢失之前的错误记录 - 直接拼接
moment对象会输出[object Object],无法显示正确时间字符串 - 不必要的
_.groupBy分组操作(若无需按itemCode分组处理,可移除) run函数标记为async但未使用await,事件驱动逻辑未利用异步特性- 调用
process.exit()过于粗暴,可能导致文件写入未完成就终止进程
优化后的代码
const csv = require('csv-parser'); const fs = require('fs'); const moment = require('moment'); const _ = require('lodash'); // 声明存储CSV数据的数组 const csvResults = []; // 创建可追加的写入流,避免覆盖已有内容 const errorStream = fs.createWriteStream('test.txt', { flags: 'a' }); function run() { fs.createReadStream('test.csv') .pipe(csv()) .on('data', (data) => csvResults.push(data)) .on('end', () => { // 若无需按itemCode分组,可直接遍历csvResults const groups = _.groupBy(csvResults, item => item['itemCode']); let errorCount = 0; for (const itemCode in groups) { for (const item of groups[itemCode]) { const startDateTime = moment(item['startAt'], 'YYYY-MM-DD HH:mm:ss'); const endDateTime = moment(item['endAt'], 'YYYY-MM-DD HH:mm:ss'); // 同时校验时间格式是否有效 if (!startDateTime.isValid() || !endDateTime.isValid()) { const errorMsg = `${item['No']} : 时间格式无效,startAt: ${item['startAt']}, endAt: ${item['endAt']}\n`; console.error(errorMsg.trim()); errorStream.write(errorMsg); errorCount++; continue; } if (startDateTime.isAfter(endDateTime)) { const errorMsg = `${item['No']} : 时间无效,startAt: ${startDateTime.format('YYYY-MM-DD HH:mm:ss')} 晚于 endAt: ${endDateTime.format('YYYY-MM-DD HH:mm:ss')}\n`; console.error(errorMsg.trim()); errorStream.write(errorMsg); errorCount++; } } } // 所有处理完成后关闭写入流,再退出进程 errorStream.end(() => { console.log(`检测完成,共发现${errorCount}条无效时间记录`); process.exit(errorCount > 0 ? 1 : 0); }); }) .on('error', (err) => { console.error('读取CSV文件失败:', err); errorStream.end(); process.exit(1); }); } run();
优化点说明
- 提前声明
csvResults数组,避免未定义错误 - 创建一次可追加的写入流
errorStream,所有错误信息写入同一个流,不会覆盖原有内容 - 使用
moment.format()将时间对象转为可读的字符串格式 - 增加时间格式有效性校验,避免无效时间字符串导致的逻辑错误
- 等待写入流关闭后再退出进程,确保所有错误信息都写入文件
- 统计错误数量,退出时返回对应状态码(非0表示有错误)
内容的提问来源于stack exchange,提问作者Rzj EM
相关产品推荐
相关产品推荐

