You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批处理文件逐行读关键词 遍历目录统计JS文件匹配次数

我来帮你把整个流程完整整合起来!先理清楚核心逻辑:读取键文件、递归遍历JS文件、逐个统计每个键的出现次数,最后输出结果。下面用Node.js实现完整方案,毕竟处理JS文件用它最顺手~

完整实现步骤与代码

1. 核心流程梳理

  • 读取键文件(假设每行一个键,比如foo.bar、lorem.ipsum),过滤空行并去重
  • 递归遍历指定目录下所有.js文件
  • 对每个JS文件,用正则匹配每个键的出现次数并累加
  • 最后输出每个键的总出现次数

2. 完整代码实现

首先需要安装glob包(用来快速遍历目录文件),执行命令:

npm install glob

然后创建统计脚本key-counter.js:

const fs = require('fs').promises;
const path = require('path');
const glob = require('glob');

// 自定义配置,根据你的实际路径修改
const CONFIG = {
  keyFilePath: './keys.txt', // 你的键文件路径
  targetDir: './src',        // 要遍历的子目录
  ignorePaths: ['**/node_modules/**'] // 可选:忽略不需要遍历的目录
};

async function runKeyCounter() {
  try {
    // 第一步:读取并处理键列表
    const keyFileContent = await fs.readFile(CONFIG.keyFilePath, 'utf8');
    const keys = keyFileContent.split('\n')
      .map(key => key.trim())
      .filter(key => key.length > 0)
      .filter((key, idx, self) => self.indexOf(key) === idx); // 去重

    if (keys.length === 0) {
      console.log('⚠️ 没有读取到有效键,请检查键文件内容');
      return;
    }

    // 第二步:获取所有要处理的JS文件
    const globPattern = path.join(CONFIG.targetDir, '**/*.js');
    const jsFiles = await new Promise((resolve, reject) => {
      glob(globPattern, { ignore: CONFIG.ignorePaths }, (err, files) => {
        err ? reject(err) : resolve(files);
      });
    });

    if (jsFiles.length === 0) {
      console.log('⚠️ 目标目录下没有找到.js文件');
      return;
    }

    // 第三步:初始化统计对象
    const countMap = {};
    keys.forEach(key => countMap[key] = 0);

    // 第四步:逐个处理JS文件,统计键的出现次数
    for (const file of jsFiles) {
      const fileContent = await fs.readFile(file, 'utf8');
      keys.forEach(key => {
        // 注意:键里的.是特殊字符,要转义成\.才能精确匹配
        const regex = new RegExp(key.replace(/\./g, '\\.'), 'g');
        const matches = fileContent.match(regex);
        if (matches) countMap[key] += matches.length;
      });
      console.log(`✅ 已处理文件: ${file}`);
    }

    // 第五步:输出最终统计结果
    console.log('\n===== 键出现次数统计结果 =====');
    Object.entries(countMap).forEach(([key, count]) => {
      console.log(`${key}: ${count} 次`);
    });

  } catch (error) {
    console.error('❌ 执行过程出错:', error.message);
  }
}

// 启动脚本
runKeyCounter();

3. 关键细节说明

  • 键的正则转义:因为键里的.在正则中表示任意字符,必须转义成\.才能精确匹配foo.bar这种格式的键
  • 异步流程控制:用async/await替代回调,让整个流程逻辑更清晰,避免回调地狱
  • 去重与过滤:自动过滤空行和重复键,避免无效统计
  • 可配置项:把路径和忽略目录做成配置,方便你根据实际场景修改

4. 可选优化方向

  • 如果要处理超大JS文件,可以改用流式读取,避免内存占用过高
  • 支持将统计结果写入到输出文件(比如results.txt),方便后续查看
  • 添加键的模糊匹配规则(如果需要的话)

内容的提问来源于stack exchange,提问作者CCR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:14:10