Собирать изменения в файле каждый фиксированный момент времени в node js

#node.js #setinterval #chokidar

#node.js #setinterval #chokidar

Вопрос:

У меня есть внешняя программа, которая время от времени передает данные в 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, но я не мог понять, как их использовать в этом случае.

Ответ №1:

fs.createReadStream может принимать start параметр

параметры могут включать начальные и конечные значения для чтения диапазона байтов из файла вместо всего файла. Как начало, так и конец включительно и начинают отсчет с 0

Итак, вам нужно сохранить последнюю прочитанную позицию и использовать ее дальше start .

Вы можете получить это с помощью: instream.bytesRead .

 let bytesRead = 0;

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

Комментарии:

1. Умное решение @Marcos Casagrande, оно очень понравилось. моя проблема сейчас в том, что, хотя данные поступают в «RawData.csv» построчно, когда я считываю их с начальным параметром bytes, они продолжаются не со следующей строки, а с середины строки. Я также пытался поместить bytesRead в событие ‘close’, и это то же самое.

2. Если он начинается с середины строки, это означает, что он закончился в середине строки, что означает, что вы начинаете чтение, когда что-то записывалось в него, вы можете попытаться компенсировать это, вычисляя начало строки.

3. Можете ли вы объяснить, что вы подразумеваете под «вычислением начала строки»? Как мне это сделать?