最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js匹配文件夾所有文件關(guān)鍵字的完整教程

 更新時(shí)間:2025年04月30日 11:38:12   作者:楠木685  
本文基于nodejs構(gòu)建一個(gè)自動(dòng)化檢測(cè)工具:讀取 Excel 中的關(guān)鍵字,在指定目錄的所有文件中搜索是否存在對(duì)應(yīng)內(nèi)容,最終生成帶標(biāo)記結(jié)果的 Excel 文件,需要的朋友可以參考下

一、場(chǎng)景需求分析

典型應(yīng)用場(chǎng)景:

  • 前端接口冗余:檢測(cè)接口是否使用
  • 前端項(xiàng)目國(guó)際化:檢測(cè)翻譯詞庫(kù)是否已全部使用
  • 代碼規(guī)范檢查:驗(yàn)證廢棄 API 是否仍存在引用
  • 文檔完整性驗(yàn)證:確認(rèn)知識(shí)庫(kù)詞條是否都有對(duì)應(yīng)文檔

二、技術(shù)棧說(shuō)明

技術(shù)版本作用
Node.js>=14.x運(yùn)行環(huán)境
xlsx^0.18.5Excel 文件處理
fs/promises內(nèi)置文件系統(tǒng)操作
path內(nèi)置路徑處理

安裝依賴:

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ù)組結(jié)構(gòu)
  const rows = xlsx.utils.sheet_to_json(sheet, { header: 1 }); 
  return { workbook, sheetName, rows };
}

注意:sheet_to_json 的 header 參數(shù)決定輸出格式:

  • header:1 → 二維數(shù)組(保留原始行列結(jié)構(gòu))
  • header:["col1","col2"] → 對(duì)象數(shù)組(自動(dòng)映射字段)

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);
    });
  });
}

最佳實(shí)踐建議:

  • 使用 fs.statSync 判斷文件類型
  • 排除 node_modules 等無(wú)關(guān)目錄
  • 添加錯(cuò)誤處理防止程序崩潰

3. 匹配檢測(cè)邏輯

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] = "是"; // 在第五列標(biāo)記
    }
  }
}

性能優(yōu)化思路:

  • 使用正則表達(dá)式預(yù)編譯
  • 增加防抖機(jī)制處理超長(zhǎng)文本
  • 支持批量處理多個(gè)工作表

四、完整代碼

const fs = require("fs");
const path = require("path");
const xlsx = require("xlsx");

const excludedDirs = ["node_modules", "public"];

// 讀取 Excel 所有行(保留結(jié)構(gòu))
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 }); // 保持?jǐn)?shù)組結(jié)構(gòu)
  return { workbook, sheetName, rows };
}

// 獲取目錄下所有文件內(nèi)容
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 = "";// 替換成你要查找的文件夾路徑,可選多個(gè)路徑

  // 1. 讀取 Excel 原始行數(shù)據(jù)
  const { workbook, sheetName, rows } = readExcelRows(excelPath);
  console.log(`?? 共讀取 ${rows.length} 行`);

  // 2. 獲取兩個(gè)目錄的所有文件內(nèi)容
  const files1 = await getAllFilesContent(targetDir1);
  const files2 = await getAllFilesContent(targetDir2);
  const allFiles = [...files1, ...files2];
  console.log(`?? 共讀取 ${allFiles.length} 個(gè)文件`);

  // 3. 遍歷 Excel 每一行,檢查第2列關(guān)鍵詞是否被文件匹配
  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(
    "? 處理完成,未匹配的關(guān)鍵詞已在第5列標(biāo)記“是”,結(jié)果已保存為 keywords_result.xlsx"
  );
}

main();

到此這篇關(guān)于Node.js匹配文件夾所有文件關(guān)鍵字的完整教程的文章就介紹到這了,更多相關(guān)Node.js匹配文件夾文件關(guān)鍵字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • nodejs中的異步編程知識(shí)點(diǎn)詳解

    nodejs中的異步編程知識(shí)點(diǎn)詳解

    在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于nodejs中的異步編程知識(shí)點(diǎn)詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-01-01
  • Node.js利用js-xlsx處理Excel文件的方法詳解

    Node.js利用js-xlsx處理Excel文件的方法詳解

    這篇文章主要給大家介紹了關(guān)于Node.js利用js-xlsx處理Excel文件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-07-07
  • NodeJS學(xué)習(xí)筆記之網(wǎng)絡(luò)編程

    NodeJS學(xué)習(xí)筆記之網(wǎng)絡(luò)編程

    Node.js采用了Google Chrome瀏覽器的V8引擎,性能很好,同時(shí)還提供了很多系統(tǒng)級(jí)的API,如文件操作、網(wǎng)絡(luò)編程等。Node.js則是一個(gè)全面的后臺(tái)運(yùn)行時(shí),為Javascript提供了其他語(yǔ)言能夠?qū)崿F(xiàn)的許多功能。今天我們來(lái)看下Nodejs的網(wǎng)絡(luò)編程
    2014-08-08
  • 我的Node.js學(xué)習(xí)之路(一)

    我的Node.js學(xué)習(xí)之路(一)

    這是一篇專門Node.js初學(xué)者學(xué)習(xí)筆記。該筆記將通過(guò)具體實(shí)例,教你一步步開(kāi)始Node.js之旅。
    2014-07-07
  • node獲取命令行中的參數(shù)詳解

    node獲取命令行中的參數(shù)詳解

    這篇文章主要為大家介紹了node獲取命令行中的參數(shù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Node.js中的cluster模塊深入解讀

    Node.js中的cluster模塊深入解讀

    NodeJS引入了Cluster模塊試圖簡(jiǎn)化這些體力勞動(dòng),使用Cluster模塊可以運(yùn)行并管理多個(gè)實(shí)例進(jìn)程,下面這篇文章主要給大家介紹了關(guān)于Node.js中cluster模塊的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧
    2018-06-06
  • Node.js domain模塊處理錯(cuò)誤的問(wèn)題操作

    Node.js domain模塊處理錯(cuò)誤的問(wèn)題操作

    文章主要介紹了Node.js中的domain模塊,用于處理未被處理的錯(cuò)誤,它提供了Domain對(duì)象,可以捕獲任何未被處理的錯(cuò)誤,并允許用戶通過(guò)創(chuàng)建、綁定、攔截回調(diào)函數(shù)及彈出與推入domain堆棧等操作來(lái)控制錯(cuò)誤處理,感興趣的朋友跟隨小編一起看看吧
    2026-04-04
  • 干凈卸載Windows的Node.js環(huán)境的方法

    干凈卸載Windows的Node.js環(huán)境的方法

    這篇文章主要介紹了如何干凈卸載Windows的Node.js環(huán)境的方法,文中通過(guò)圖文結(jié)合的方式講解的非常詳細(xì),對(duì)大家刪除Node.js環(huán)境有一定的幫助,需要的朋友可以參考下
    2025-01-01
  • 詳解Node.js 中使用 ECDSA 簽名遇到的坑

    詳解Node.js 中使用 ECDSA 簽名遇到的坑

    這篇文章主要介紹了詳解Node.js 中使用 ECDSA 簽名遇到的坑,主要是使用 Node.js 的 Crypto 模塊無(wú)法校驗(yàn)網(wǎng)絡(luò)傳輸過(guò)來(lái)的簽名結(jié)果,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 利用node實(shí)現(xiàn)數(shù)據(jù)庫(kù)數(shù)據(jù)導(dǎo)出到Excel

    利用node實(shí)現(xiàn)數(shù)據(jù)庫(kù)數(shù)據(jù)導(dǎo)出到Excel

    本文將詳細(xì)講解如何使用Node.js實(shí)現(xiàn)從MySQL數(shù)據(jù)庫(kù)獲取數(shù)據(jù),并生成包含多個(gè)工作表的 Excel 文件,每個(gè)工作表對(duì)應(yīng)數(shù)據(jù)庫(kù)中的一個(gè)表,有需要的可以了解下
    2024-11-11

最新評(píng)論

弋阳县| 梁山县| 韶关市| 永嘉县| 玛多县| 古丈县| 双鸭山市| 田东县| 青州市| 平泉县| 隆回县| 天台县| 公安县| 古交市| 南靖县| 闸北区| 三明市| 丰都县| 芒康县| 垫江县| 尼勒克县| 镇赉县| 德惠市| 鲜城| 库尔勒市| 团风县| 长兴县| 三都| 邻水| 胶南市| 新竹市| 永仁县| 竹溪县| 汉沽区| 泗水县| 秦安县| 偃师市| 竹北市| 恩平市| 达孜县| 延边|