【问题标题】:NodeJS: Detect last new line byte from Readable Stream when reading by Range to parse large CSV fileNodeJS:通过 Range 读取以解析大型 CSV 文件时,从可读流中检测最后一个新行字节
【发布时间】:2020-03-25 08:34:40
【问题描述】:

说明

我有一个非常大的 CSV 文件(大约 1 GB),我想以每个大约 10 MB 的字节块进行处理。为此,我正在使用byte-range option 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 })

【问题讨论】:

    标签: node.js csv nodejs-stream


    【解决方案1】:

    下面是基本代码

    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 模块可以让你更高效地逐行读取数据流

    【讨论】:

      猜你喜欢
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      相关资源
      最近更新 更多