【问题标题】:How to get the progress of nodejs readline or any other ways of reading a large file line by line?如何获取nodejs readline的进度或任何其他逐行读取大文件的方式?
【发布时间】:2021-02-08 03:45:22
【问题描述】:

我正在使用node's readline module 对一个我必须逐行读取的大文件进行一些处理,并且由于它很大,因此需要很长时间。

我需要一种监控和报告操作总进度的方法(最好使用readline

readline 创建的Interface 发出的'line' 事件不提供与此用例相关的任何内容。 readline的其他事件或方法也没有其他有用的数据。

我也找不到任何可以满足我需要的 readline 的替代解决方案。

例如,当通过网络(通过 HTTP 和 XHR/fetch 或任何 TCP 连接)下载资源时,如果数据包到来,并且拥有字节总数,则可以访问输入的字节读取我们可以计算进度。

【问题讨论】:

    标签: node.js file terminal command-line-interface


    【解决方案1】:

    刚写完最后一段,我就有了解决方案的想法!

    readlineInterface 发出的'line' 事件将行作为字符串返回,我们可以计算该字符串的字节数并使用它来维护总字节读取。

    在开始读取文件之前,我们可以得到文件的大小,一个简单的除法可以为我们提供每一行的进度。

    假设字符串中的每个字符都是一个字节的大小,这不是所有情况下的正确假设(对我来说),我是这样做的:

    const fs = require('fs')
    const readline = require('readline')
    
    const input = 'my-huge-file'
    
    const inputSize = fs.statSync(input).size
    
    let progressDate = Date.now()
    let inputRead = 0
    
    const rl = readline.createInterface({input: fs.createReadStream(input), crlfDelay: Infinity })
    rl.on('line', line => {
      inputRead += line.length+1 // also count the \n
      const now = Date.now()
      if (now-progressDate>1000) {
        process.stdout.write(`\r${Math.floor(10000*inputRead/inputSize)/100}%`)
        progressDate = now
      }
    
      // PROCESS the line
    });
    

    我添加了progressDate 以每秒打印进度(而不是每行)

    【讨论】:

      猜你喜欢
      • 2011-12-22
      • 1970-01-01
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多