Node.js匹配文件夹所有文件关键字的完整教程

 更新时间:2025年04月30日 11:38:12   作者:楠木685  
本文基于nodejs构建一个自动化检测工具:读取 Excel 中的关键字,在指定目录的所有文件中搜索是否存在对应内容,最终生成带标记结果的 Excel 文件,需要的朋友可以参考下

一、场景需求分析

典型应用场景:

  • 前端接口冗余:检测接口是否使用
  • 前端项目国际化:检测翻译词库是否已全部使用
  • 代码规范检查:验证废弃 API 是否仍存在引用
  • 文档完整性验证:确认知识库词条是否都有对应文档

二、技术栈说明

技术版本作用
Node.js>=14.x运行环境
xlsx^0.18.5Excel 文件处理
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匹配文件夹文件关键字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • nodejs中的异步编程知识点详解

    nodejs中的异步编程知识点详解

    在本篇内容里小编给大家整理的是一篇关于nodejs中的异步编程知识点详解内容,有兴趣的朋友们可以学习下。
    2021-01-01
  • Node.js利用js-xlsx处理Excel文件的方法详解

    Node.js利用js-xlsx处理Excel文件的方法详解

    这篇文章主要给大家介绍了关于Node.js利用js-xlsx处理Excel文件的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-07-07
  • NodeJS学习笔记之网络编程

    NodeJS学习笔记之网络编程

    Node.js采用了Google Chrome浏览器的V8引擎,性能很好,同时还提供了很多系统级的API,如文件操作、网络编程等。Node.js则是一个全面的后台运行时,为Javascript提供了其他语言能够实现的许多功能。今天我们来看下Nodejs的网络编程
    2014-08-08
  • 我的Node.js学习之路(一)

    我的Node.js学习之路(一)

    这是一篇专门Node.js初学者学习笔记。该笔记将通过具体实例,教你一步步开始Node.js之旅。
    2014-07-07
  • node获取命令行中的参数详解

    node获取命令行中的参数详解

    这篇文章主要为大家介绍了node获取命令行中的参数详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Node.js中的cluster模块深入解读

    Node.js中的cluster模块深入解读

    NodeJS引入了Cluster模块试图简化这些体力劳动,使用Cluster模块可以运行并管理多个实例进程,下面这篇文章主要给大家介绍了关于Node.js中cluster模块的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧
    2018-06-06
  • Node.js domain模块处理错误的问题操作

    Node.js domain模块处理错误的问题操作

    文章主要介绍了Node.js中的domain模块,用于处理未被处理的错误,它提供了Domain对象,可以捕获任何未被处理的错误,并允许用户通过创建、绑定、拦截回调函数及弹出与推入domain堆栈等操作来控制错误处理,感兴趣的朋友跟随小编一起看看吧
    2026-04-04
  • 干净卸载Windows的Node.js环境的方法

    干净卸载Windows的Node.js环境的方法

    这篇文章主要介绍了如何干净卸载Windows的Node.js环境的方法,文中通过图文结合的方式讲解的非常详细,对大家删除Node.js环境有一定的帮助,需要的朋友可以参考下
    2025-01-01
  • 详解Node.js 中使用 ECDSA 签名遇到的坑

    详解Node.js 中使用 ECDSA 签名遇到的坑

    这篇文章主要介绍了详解Node.js 中使用 ECDSA 签名遇到的坑,主要是使用 Node.js 的 Crypto 模块无法校验网络传输过来的签名结果,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • 利用node实现数据库数据导出到Excel

    利用node实现数据库数据导出到Excel

    本文将详细讲解如何使用Node.js实现从MySQL数据库获取数据,并生成包含多个工作表的 Excel 文件,每个工作表对应数据库中的一个表,有需要的可以了解下
    2024-11-11

最新评论