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

如何基于现有单文件代码批量合并两个目录下的同名CSV文件?

批量合并同名CSV文件解决方案

我明白你现在的需求——不用手动逐个修改代码,一次运行就能把两个目录里所有同名的CSV文件合并到目标目录对吧?下面我基于你现有的代码扩展出一套完整的批量处理方案:

实现思路

  1. 先获取其中一个目录(比如folderA)下的所有CSV文件名
  2. 遍历每个文件名,检查另一个目录(folderB)是否存在同名文件
  3. 对每个存在的同名文件,复用你已经实现的合并逻辑
  4. 把合并后的结果统一写入到folderC目录

完整代码示例

const fs = require('fs');
const path = require('path');
const fastcsv = require('fast-csv');
const csv = require('csv-parser');

// 定义三个目录的路径
const folderA = 'folderA';
const folderB = 'folderB';
const folderC = 'folderC';

// 先确保目标目录folderC存在,不存在则自动创建
if (!fs.existsSync(folderC)) {
    fs.mkdirSync(folderC);
}

// 封装读取CSV的Promise函数,避免嵌套回调地狱
const readCSVFile = (filePath) => {
    return new Promise((resolve, reject) => {
        const dataRows = [];
        fs.createReadStream(filePath)
            .pipe(csv())
            .on('data', (row) => dataRows.push(row))
            .on('end', () => resolve(dataRows))
            .on('error', (err) => reject(err));
    });
};

// 封装单个文件的合并与写入逻辑
const mergeSingleCSV = async (filename) => {
    const fileAPath = path.join(folderA, filename);
    const fileBPath = path.join(folderB, filename);

    // 检查两个目录是否都有这个文件,避免报错
    if (!fs.existsSync(fileAPath) || !fs.existsSync(fileBPath)) {
        console.log(`跳过 ${filename}:其中一个目录中不存在该文件`);
        return;
    }

    try {
        // 并行读取两个文件,提升处理效率
        const [dataFromA, dataFromB] = await Promise.all([
            readCSVFile(fileAPath),
            readCSVFile(fileBPath)
        ]);

        // 合并数据(如果需要去重、排序等特殊处理,可以在这里修改逻辑)
        const mergedData = dataFromA.concat(dataFromB);

        // 写入到folderC目录
        const outputPath = path.join(folderC, filename);
        await new Promise((resolve, reject) => {
            fastcsv
                .writeToPath(outputPath, mergedData)
                .on('finish', resolve)
                .on('error', reject);
        });

        console.log(`已完成 ${filename} 的合并`);
    } catch (err) {
        console.error(`处理 ${filename} 时出错:`, err);
    }
};

// 批量处理所有CSV文件的入口函数
const processAllCSVs = async () => {
    try {
        // 获取folderA下所有的CSV文件
        const csvFiles = fs.readdirSync(folderA).filter(file => path.extname(file) === '.csv');

        // 遍历每个文件执行合并
        for (const file of csvFiles) {
            await mergeSingleCSV(file);
        }

        console.log('所有文件合并完成!');
    } catch (err) {
        console.error('获取目录文件列表时出错:', err);
    }
};

// 启动批量处理
processAllCSVs();

代码亮点说明

  • 自动创建目录:提前检查并创建folderC,避免写入失败
  • Promise化异步操作:把读取、写入逻辑封装成Promise,让代码更易读,告别嵌套回调
  • 并行读取优化:用Promise.all同时读取两个文件,比顺序读取更快
  • 容错处理:增加文件存在性检查和异常捕获,单个文件出错不会打断整个流程
  • 完全自动化:自动识别目录下的所有CSV文件,不用手动指定文件名

运行这段代码后,folderC里就会自动生成所有合并后的同名CSV文件啦!

内容的提问来源于stack exchange,提问作者Dusky Dood

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:02:31