node实现查询一部小说各角色出现的次数

文章讲述了作者如何使用Node.js的Koa框架,配合fs和readline模块,实现在《斗破苍穹》文本中统计特定角色名称出现的次数,展示了从创建服务到读取大文件并处理的详细过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近,斗破苍穹动漫也是看到了三上云岚宗哈,一时无聊,就用node写了个查询斗破苍穹各人物名称出现的次数。

首先,我们先自己创建个文本测试一下,文本内容如下:

 然后我们开始搭建node服务,采用node的Koa框架,执行以下两行命令

npm init -y

npm install koa --save

读取一个文本,那么我们就需要使用到,node当中的fs来创建文件流,因为我们要读取的文本是小说,有几百万字的,所以用readline来逐行读取文本。下面上代码:

const Koa = require('koa');
const fs = require('fs');
const readline = require('readline');
const path = require('path');
const app = new Koa();
const filePath = path.join(__dirname, '1.txt');
app.use(async (ctx) => {
      const characterNames = ['萧炎',"薰儿","美杜莎","彩鳞","小医仙","云韵","云芝","药尘","药尊","药老","萧炎哥哥"]; // 你需要识别的角色名称列表,可以根据实际情况进行修改
      const characterCounts = {}; // 用于存储角色名称出现的次数
      characterNames.forEach(name => {
        characterCounts[name] = 0; // 初始化角色统计次数为0
      });
      try {
        const readStream = fs.createReadStream(filePath, 'utf-8');//用fs模块创建文件流
        const rl = readline.createInterface({
            input: readStream, // 用 path 直接创建文件流
            crlfDelay: Infinity // 自动识别行分隔符,以支持Windows和Linux平台
        });
        for await (const line of rl) {  
            characterNames.forEach(name => {
              const regex = new RegExp(name, 'g');
              const count = (line.match(regex) || []).length;
              characterCounts[name] += count;
            });
          }
    
          ctx.body = characterCounts;// 将统计结果作为响应返回给客户端
      } catch (error) {
        console.error('Error reading file:', error);
        ctx.status = 500;
        ctx.body = 'Error reading file';
      }
});

const port = 3000;
app.listen(port, () => {
  console.log(`Server is running on http://localhost:${port}`);
});

运行代码,得到的结果为:

{"萧炎":3,"薰儿":2,"美杜莎":0,"彩鳞":0,"小医仙":0,"云韵":0,"云芝":0,"药尘":0,"药尊":0,"药老":0,"萧炎哥哥":0}

发现我们的测试文本是没错的,那我们直接上整篇《斗破苍穹》。

const Koa = require('koa');
const fs = require('fs');
const readline = require('readline');
const path = require('path');
const app = new Koa();
const filePath = path.join(__dirname, '斗破苍穹.txt');
app.use(async (ctx) => {
      const characterNames = ['萧炎',"薰儿","美杜莎","彩鳞","小医仙","云韵","云芝","药尘","药尊","药老","萧炎哥哥"]; // 你需要识别的角色名称列表,可以根据实际情况进行修改
      const characterCounts = {}; // 用于存储角色名称出现的次数
      characterNames.forEach(name => {
        characterCounts[name] = 0; // 初始化角色统计次数为0
      });
      try {
        const readStream = fs.createReadStream(filePath, 'utf-8');//用fs模块创建文件流
        const rl = readline.createInterface({
            input: readStream, // 用 path 直接创建文件流
            crlfDelay: Infinity // 自动识别行分隔符,以支持Windows和Linux平台
        });
        for await (const line of rl) {  
            characterNames.forEach(name => {
              const regex = new RegExp(name, 'g');
              const count = (line.match(regex) || []).length;
              characterCounts[name] += count;
            });
          }
    
          ctx.body = characterCounts;// 将统计结果作为响应返回给客户端
      } catch (error) {
        console.error('Error reading file:', error);
        ctx.status = 500;
        ctx.body = 'Error reading file';
      }
});

const port = 3000;
app.listen(port, () => {
  console.log(`Server is running on http://localhost:${port}`);
});

 最后,运行代码结果为:

{"萧炎":45902,"薰儿":3024,"美杜莎":1545,"彩鳞":511,"小医仙":2386,"云韵":680,"云芝":296,"药尘":285,"药尊":53,"药老":3668,"萧炎哥哥":422}

 想核实结果的小伙伴自行根据小说去数一下哈QAQ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值