如何基于现有单文件代码批量合并两个目录下的同名CSV文件?
批量合并同名CSV文件解决方案
我明白你现在的需求——不用手动逐个修改代码,一次运行就能把两个目录里所有同名的CSV文件合并到目标目录对吧?下面我基于你现有的代码扩展出一套完整的批量处理方案:
实现思路
- 先获取其中一个目录(比如folderA)下的所有CSV文件名
- 遍历每个文件名,检查另一个目录(folderB)是否存在同名文件
- 对每个存在的同名文件,复用你已经实现的合并逻辑
- 把合并后的结果统一写入到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
相关产品推荐
相关产品推荐

