You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:15:39