繁体   English   中英

NodeJS:在按范围读取以解析大型 CSV 文件时,检测可读流中的最后一个新行字节

[英]NodeJS: Detect last new line byte from Readable Stream when reading by Range to parse large CSV file

描述

我有一个非常大的 CSV 文件(大约 1 GB),我想以每个大约 10 MB 的字节块进行处理。 为此,我创建了一个带有字节范围选项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 })

下面是基本代码

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);
 });

演示https : //repl.it/@sandeepp2016/SpiritedRowdyObject

但是已经有一个像fast-csv这样的 CSV 解析器,或者你可以使用readLine模块让你更有效地逐行读取数据流

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM