欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Node.js匹配文件夾所有文件關鍵字的完整教程

 更新時間:2025年04月30日 11:38:12   作者:楠木685  
本文基于nodejs構建一個自動化檢測工具:讀取 Excel 中的關鍵字,在指定目錄的所有文件中搜索是否存在對應內容,最終生成帶標記結果的 Excel 文件,需要的朋友可以參考下

一、場景需求分析

典型應用場景:

  • 前端接口冗余:檢測接口是否使用
  • 前端項目國際化:檢測翻譯詞庫是否已全部使用
  • 代碼規(guī)范檢查:驗證廢棄 API 是否仍存在引用
  • 文檔完整性驗證:確認知識庫詞條是否都有對應文檔

二、技術棧說明

技術版本作用
Node.js>=14.x運行環(huán)境
xlsx^0.18.5Excel 文件處理
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頭的方法示例

    這篇文章主要介紹了Node.js設置HTTP頭的方法,詳細分析了常見HTTP頭的功能、原理及相關設置操作技巧,需要的朋友可以參考下
    2017-04-04
  • Node.js?連接?MySql?統(tǒng)計組件屬性的使用情況解析

    Node.js?連接?MySql?統(tǒng)計組件屬性的使用情況解析

    這篇文章主要為大家介紹了Node.js?連接?MySql?統(tǒng)計組件屬性的使用情況解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • node實現(xiàn)socket鏈接與GPRS進行通信的方法

    node實現(xiàn)socket鏈接與GPRS進行通信的方法

    這篇文章主要介紹了node實現(xiàn)socket鏈接與GPRS進行通信的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • nodejs?express實現(xiàn)中間件

    nodejs?express實現(xiàn)中間件

    這篇文章主要為大家介紹了nodejs?express實現(xiàn)中間件實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Node.js 多線程實戰(zhàn)小結

    Node.js 多線程實戰(zhàn)小結

    在?Node.js?的世界中,多線程技術一直是一個受到廣泛關注的領域,本文主要介紹了Node.js 多線程實戰(zhàn)小結,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • 利用Node.js了解與測量HTTP所花費的時間詳解

    利用Node.js了解與測量HTTP所花費的時間詳解

    這篇文章主要給大家介紹了關于利用Node.js了解與測量HTTP所花費的時間的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-09-09
  • 基于Node.js實現(xiàn)nodemailer郵件發(fā)送

    基于Node.js實現(xiàn)nodemailer郵件發(fā)送

    Nodemailer 是一個簡單易用的 Node.JS 郵件發(fā)送模塊(通過 SMTP,sendmail,或者 Amazon SES),支持 unicode,你可以使用任何你喜歡的字符集。Nodemailer是一個簡單易用的Node.js郵件發(fā)送組件,需要的朋友可以參考下
    2016-01-01
  • Node.js與MySQL交互操作及其注意事項

    Node.js與MySQL交互操作及其注意事項

    這篇文章給大家主要介紹了Node.js與MySQL交互操作及其注意事項,非常的詳細,有相同需求的小伙伴可以參考下
    2016-10-10
  • 從零開始學習Node.js系列教程五:服務器監(jiān)聽方法示例

    從零開始學習Node.js系列教程五:服務器監(jiān)聽方法示例

    這篇文章主要介紹了Node.js服務器監(jiān)聽方法,結合實例形式分析了nodejs事件監(jiān)聽相關操作技巧,需要的朋友可以參考下
    2017-04-04
  • Node.js 制作實時多人游戲框架

    Node.js 制作實時多人游戲框架

    這篇文章主要介紹了Node.js 制作實時多人游戲框架,需要的朋友可以參考下
    2015-01-01

最新評論