Node.js匹配文件夾所有文件關鍵字的完整教程
更新時間:2025年04月30日 11:38:12 作者:楠木685
本文基于nodejs構建一個自動化檢測工具:讀取 Excel 中的關鍵字,在指定目錄的所有文件中搜索是否存在對應內容,最終生成帶標記結果的 Excel 文件,需要的朋友可以參考下
一、場景需求分析
典型應用場景:
- 前端接口冗余:檢測接口是否使用
- 前端項目國際化:檢測翻譯詞庫是否已全部使用
- 代碼規(guī)范檢查:驗證廢棄 API 是否仍存在引用
- 文檔完整性驗證:確認知識庫詞條是否都有對應文檔
二、技術棧說明
技術 | 版本 | 作用 |
---|---|---|
Node.js | >=14.x | 運行環(huán)境 |
xlsx | ^0.18.5 | Excel 文件處理 |
fs/promises | 內置 | 文件系統(tǒng)操作 |
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 表示保留二維數(shù)組結構 const rows = xlsx.utils.sheet_to_json(sheet, { header: 1 }); return { workbook, sheetName, rows }; }
注意:sheet_to_json 的 header 參數(shù)決定輸出格式:
header:1
→ 二維數(shù)組(保留原始行列結構)header:["col1","col2"]
→ 對象數(shù)組(自動映射字段)
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]; // 取第二列數(shù)據(jù) if (typeof keyword === "string") { const matched = allFiles.some((file) => file.content.includes(keyword) ); if (!matched) { row[4] = "是"; // 在第五列標記 } } }
性能優(yōu)化思路:
- 使用正則表達式預編譯
- 增加防抖機制處理超長文本
- 支持批量處理多個工作表
四、完整代碼
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 }); // 保持數(shù)組結構 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); }); }); } // 主函數(shù) async function main() { const excelPath = "./data.xlsx"; // 替換成你的 Excel 文件路徑 const targetDir1 = ""; // 替換成你要查找的文件夾路徑 const targetDir2 = "";// 替換成你要查找的文件夾路徑,可選多個路徑 // 1. 讀取 Excel 原始行數(shù)據(jù) 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匹配文件夾文件關鍵字內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
從零開始學習Node.js系列教程之設置HTTP頭的方法示例
這篇文章主要介紹了Node.js設置HTTP頭的方法,詳細分析了常見HTTP頭的功能、原理及相關設置操作技巧,需要的朋友可以參考下2017-04-04Node.js?連接?MySql?統(tǒng)計組件屬性的使用情況解析
這篇文章主要為大家介紹了Node.js?連接?MySql?統(tǒng)計組件屬性的使用情況解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10node實現(xiàn)socket鏈接與GPRS進行通信的方法
這篇文章主要介紹了node實現(xiàn)socket鏈接與GPRS進行通信的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-05-05基于Node.js實現(xiàn)nodemailer郵件發(fā)送
Nodemailer 是一個簡單易用的 Node.JS 郵件發(fā)送模塊(通過 SMTP,sendmail,或者 Amazon SES),支持 unicode,你可以使用任何你喜歡的字符集。Nodemailer是一個簡單易用的Node.js郵件發(fā)送組件,需要的朋友可以參考下2016-01-01從零開始學習Node.js系列教程五:服務器監(jiān)聽方法示例
這篇文章主要介紹了Node.js服務器監(jiān)聽方法,結合實例形式分析了nodejs事件監(jiān)聽相關操作技巧,需要的朋友可以參考下2017-04-04