NodeJS: определение последнего байта новой строки из потока для чтения при чтении по диапазону для анализа большого файла CSV - PullRequest
0 голосов
/ 25 марта 2020

Описание

У меня есть очень большой файл CSV (около 1 ГБ), который я хочу обработать в виде байтовых блоков размером около 10 МБ каждый. Для этой цели я создаю читаемый поток с параметром байтового диапазона fs.createReadStream(sampleCSVfile, { start: 0, end: 10000000 })

Задача

Используя вышеуказанный подход, поток чтение из файла CSV содержит данные для последней строки, которая не является полной. Мне нужен способ определить индекс байтов, при котором произошел последний разрыв строки, и запустить мой следующий читаемый поток с этим байтовым индексом.

Пример CSV: (игнорировать строку заголовка)

John,New York,52
Stacy,Chicago,19
Lisa,Indianapolis,40

Пример операции:

fs.createReadStream(sampleCSVfile, { start: 0, end: 99 })

Возвращенные данные: (обрезано до указанного выше байтового диапазона)

John,New York,52
Stacy,Chicago,19
Lisa,I

Обязательный или ожидаемый:

John,New York,52
Stacy,Chicago,19

Итак, предположим, что из потока, извлеченного последней последней строкой, заканчивающейся байтовым индексом 78, моя следующая рекурсивная операция будет быть: fs.createReadStream(sampleCSVfile, { start: 79, end: 178 })

1 Ответ

0 голосов
/ 25 марта 2020

Ниже приведен базовый c код

const fs = require('fs');

let stream =fs.createReadStream('test.csv', { start:0, end:40})

stream.on('data', (data) => {                       
   console.log(data.length);  //
   let a = data.toString()
   console.log(a);
   let i = a.lastIndexOf('\n');
   console.log(i);
   let substr= a.substring(0, i);
   console.log(substr);
   let byteLength= Buffer.byteLength(substr);
   console.log(byteLength);
 });

DEMO : https://repl.it/@sandeepp2016 / SpiritedRowdyObject

Но уже есть синтаксический анализатор CSV, такой как fast-csv , или вы можете использовать модуль readLine , который позволит вам более эффективно читать пару строк за строкой

...