【问题标题】:Collect changes in a file every fixed time in node js在节点js中每隔固定时间收集文件中的更改
【发布时间】:2019-03-12 16:06:46
【问题描述】:

我有一个外部程序不时将数据流式传输到 csv 文件(但经常退出)。 我想每 10 秒收集一次所有更改的数据并对其进行一些处理。 表示我只想处理我之前没有处理过的行。

这是基本代码:

function myFunction() {

  var loop = setInterval(
    () =>
      {
          var instream = fs.createReadStream("rawData.csv"); //should somehow include only new data since last cycle
          var outstream = fs.createWriteStream("afterProcessing.csv");
          someProcessing(instream, outstream);
          outstream.on('finish', () => {
               sendBackResults("afterProcessing.csv");
                });
        //will exit the loop when 'run' flag will change to false
          if(!run) ? clearInterval(loop) : console.log(`\nStill Running...\n`) ;
      } , 10000 );    

 }

现在,我尝试使用 chokidar 和 fs.watch,但我不知道在这种情况下如何使用它们。

【问题讨论】:

    标签: node.js setinterval chokidar


    【解决方案1】:

    fs.createReadStream 可以带一个start 参数

    选项可以包括开始和结束值以读取一系列字节 文件而不是整个文件。 start 和 end 都包含在内 并从 0 开始计数

    所以你需要保存最后读取的位置,并在start上使用它。

    您可以使用:instream.bytesRead

    let bytesRead = 0;
    
    instream.on('end', () => {
      bytesRead = instream.bytesRead;
    });
    

    【讨论】:

    • 聪明的解决方案@Marcos Casagrande,非常喜欢。我现在的问题是,尽管数据逐行进入“rawData.csv”,但当我使用字节的开始参数读取它时,它不会继续下一行,而是从一行的中间开始。我还尝试将 bytesRead 放在“关闭”事件中,结果是一样的。
    • 如果它从一行的中间开始,这意味着它在一行的中间结束,这意味着你在写东西时开始阅读,你可以尝试抵消它,计算行首。
    • 你能解释一下“计算行首”是什么意思吗?我该怎么做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 2015-08-23
    • 2012-04-06
    • 1970-01-01
    • 2011-09-11
    相关资源
    最近更新 更多