Node.js匹配文件夹所有文件关键字的完整教程
作者:楠木685
本文基于nodejs构建一个自动化检测工具:读取 Excel 中的关键字,在指定目录的所有文件中搜索是否存在对应内容,最终生成带标记结果的 Excel 文件,需要的朋友可以参考下
一、场景需求分析
典型应用场景:
- 前端接口冗余:检测接口是否使用
- 前端项目国际化:检测翻译词库是否已全部使用
- 代码规范检查:验证废弃 API 是否仍存在引用
- 文档完整性验证:确认知识库词条是否都有对应文档
二、技术栈说明
技术 | 版本 | 作用 |
---|---|---|
Node.js | >=14.x | 运行环境 |
xlsx | ^0.18.5 | Excel 文件处理 |
fs/promises | 内置 | 文件系统操作 |
path | 内置 | 路径处理 |
安装依赖:
npm install xlsx
三、核心代码解析
1. Excel读取模块
const xlsx = require("xlsx"); function readExcelRows(filePath) { const workbook = xlsx.readFile(filePath); const sheetName = workbook.SheetNames[0]; const sheet = workbook.Sheets[sheetName]; // header:1 表示保留二维数组结构 const rows = xlsx.utils.sheet_to_json(sheet, { header: 1 }); return { workbook, sheetName, rows }; }
注意:sheet_to_json 的 header 参数决定输出格式:
header:1
→ 二维数组(保留原始行列结构)header:["col1","col2"]
→ 对象数组(自动映射字段)
2. 目录遍历模块
async function getAllFilesContent(dirPath, fileList = []) { return new Promise((resolve, reject) => { fs.readdir(dirPath, async (err, files) => { if (err) return reject(err); for (const file of files) { const fullPath = path.join(dirPath, file); const stats = fs.statSync(fullPath); if (stats.isDirectory()) { if (!excludedDirs.includes(file)) { await getAllFilesContent(fullPath, fileList); } } else if (stats.isFile()) { try { const content = fs.readFileSync(fullPath, "utf8"); fileList.push({ path: fullPath, content }); } catch (err) { console.error(`读取文件失败: ${fullPath}`); } } } resolve(fileList); }); }); }
最佳实践建议:
- 使用
fs.statSync
判断文件类型 - 排除
node_modules
等无关目录 - 添加错误处理防止程序崩溃
3. 匹配检测逻辑
for (let i = 0; i < rows.length; i++) { const row = rows[i]; const keyword = row[1]; // 取第二列数据 if (typeof keyword === "string") { const matched = allFiles.some((file) => file.content.includes(keyword) ); if (!matched) { row[4] = "是"; // 在第五列标记 } } }
性能优化思路:
- 使用正则表达式预编译
- 增加防抖机制处理超长文本
- 支持批量处理多个工作表
四、完整代码
const fs = require("fs"); const path = require("path"); const xlsx = require("xlsx"); const excludedDirs = ["node_modules", "public"]; // 读取 Excel 所有行(保留结构) function readExcelRows(filePath) { const workbook = xlsx.readFile(filePath); const sheetName = workbook.SheetNames[0]; const sheet = workbook.Sheets[sheetName]; const rows = xlsx.utils.sheet_to_json(sheet, { header: 1 }); // 保持数组结构 return { workbook, sheetName, rows }; } // 获取目录下所有文件内容 async function getAllFilesContent(dirPath, fileList = []) { return new Promise((resolve, reject) => { fs.readdir(dirPath, async (err, files) => { if (err) return reject(err); for (const file of files) { const fullPath = path.join(dirPath, file); const stats = fs.statSync(fullPath); if (stats.isDirectory()) { if (!excludedDirs.includes(file)) { await getAllFilesContent(fullPath, fileList); } } else if (stats.isFile()) { try { const content = fs.readFileSync(fullPath, "utf8"); fileList.push({ path: fullPath, content }); } catch (err) { console.error(`读取文件失败: ${fullPath}`); } } } resolve(fileList); }); }); } // 主函数 async function main() { const excelPath = "./data.xlsx"; // 替换成你的 Excel 文件路径 const targetDir1 = ""; // 替换成你要查找的文件夹路径 const targetDir2 = "";// 替换成你要查找的文件夹路径,可选多个路径 // 1. 读取 Excel 原始行数据 const { workbook, sheetName, rows } = readExcelRows(excelPath); console.log(`📋 共读取 ${rows.length} 行`); // 2. 获取两个目录的所有文件内容 const files1 = await getAllFilesContent(targetDir1); const files2 = await getAllFilesContent(targetDir2); const allFiles = [...files1, ...files2]; console.log(`📄 共读取 ${allFiles.length} 个文件`); // 3. 遍历 Excel 每一行,检查第2列关键词是否被文件匹配 for (let i = 0; i < rows.length; i++) { const row = rows[i]; const keyword = row[1]; // 第二列 if (typeof keyword === "string") { const matched = allFiles.some((file) => file.content.includes(keyword)); if (!matched) { row[4] = "是"; // 第5列写入“是” } } } // 4. 写回新的 Excel 文件 const newSheet = xlsx.utils.aoa_to_sheet(rows); const newWorkbook = xlsx.utils.book_new(); xlsx.utils.book_append_sheet(newWorkbook, newSheet, sheetName); xlsx.writeFile(newWorkbook, "./test.xlsx"); console.log( "✅ 处理完成,未匹配的关键词已在第5列标记“是”,结果已保存为 keywords_result.xlsx" ); } main();
到此这篇关于Node.js匹配文件夹所有文件关键字的完整教程的文章就介绍到这了,更多相关Node.js匹配文件夹文件关键字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!