#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. Можете ли вы объяснить, что вы подразумеваете под «вычислением начала строки»? Как мне это сделать?