首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在node.js中逐行读取文件并执行分析?

在node.js中逐行读取文件并执行分析?
EN

Stack Overflow用户
提问于 2019-03-24 23:31:44
回答 1查看 414关注 0票数 0

我有一个文件,我想逐行读取它,对于提取的每一行,我都会执行一些昂贵的分析,然后将结果保存到数据库中。简而言之,我有这样的东西:

代码语言:javascript
复制
const fs = require('fs');
const path = require('path');
const readline = require('readline');

async function analyzeAndSave(url) {
  // Removed for brevity, but this function takes a minute or so finsh.
}

async function run() {
  try {
    const dataPath  = path.join(path.dirname(require.main.filename), 'data/urls.txt');

    const rl = readline.createInterface({
      input: fs.createReadStream(dataPath),
    });

    let line_no = 0;
    rl.on('line', async (url) => {
      line_no++;
      logger.info(`Analyzing: ${url}`);
      await analyzeAndSave(url);
    });
  } catch (err) {
    // Error caught.
    logger.error(err);
  }
}

run();

这样做的问题是,我注意到它并不是等待一行的分析完成,而是尝试执行多个分析实例。我认为这是因为它最初使用logger.info('Analyzing: ' + url);`打印所有行。因此,它不是按顺序执行的。如何确保一行结束后再转到下一行?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-25 00:02:18

readline接口异步地发出"on“事件,并且在其中一个事件中执行await并不会阻止其他事件被触发。相反,您可以缓冲数组中的行,如下所示:

代码语言:javascript
复制
r.on('line', url => urls.push(url));
r.on('close', async () => {
  for (const url of urls) {
    await analyzeAndSave(url);
  }
});

其中在创建readline接口之前将urls初始化为空数组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55325415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档