【问题标题】:Reading and parsing large files读取和解析大文件
【发布时间】:2017-01-22 18:30:18
【问题描述】:

我有一个非常大的文件,我需要解析和读取“BEGIN DATA”和“END DATA”分隔符之间的数据,然后执行类似解码块的操作。

我可以像这样使用“fs”库轻松打开文件:

  fs.readFile(files[0], 'utf8', function (err, data) {
  if (err) return console.log(err);
  console.log(data)
 });

但是,我需要通过流读取块中分隔符之间的数据,因此不要使用大量内存。

        -----BEGIN DATA-----
        MIIEzDCCArSgAwIBAgIVCugKYzMN5ra8zPWxYE8pUU9SxjYSMA0GCSqGSIb3DQEB
        CwUAMHAxCzAJBgNVBAYTAkdCMRUwEwYDVQQIDAxXYXJ3aWNrc2hpcmUxEDAOBgNV
        BAcMB1dhcndpY2sxEDAOBgNVBAoMB0VudHJ1c3QxETAPBgNVBAsMCFBLSSBURUFN
        -----END DATA-----
        -----BEGIN DATA-----
        MIIETzCCAjegAwIBAgIVBShP2Mx74DZEyNKwYZZPGntRmSWnMA0GCSqGSIb3DQEB
        DQUAMHIxCzAJBgNVBAYTAkdCMRUwEwYDVQQIDAxXYXJ3aWNrc2hpcmUxEDAOBgNV
        BAcMB1dhcndpY2sxDDAKBgNVBAoMA0lCTTERMA8GA1UECwwIUEtJIFRFQU0xGTAX
        5/62
        -----END DATA-----

【问题讨论】:

    标签: node.js stream fs


    【解决方案1】:

    最简单的方法是使用与节点的fs.createReadStream 耦合的流库,在您的情况下,Highland.js 中的splitBy 方法将是合适的:

    _(fs.createReadStream(files[0], { encoding: 'utf8' }))
      .splitBy('-----BEGIN DATA-----')
      .splitBy('-----END DATA-----')
      .each(_.log)
    

    【讨论】:

    • 谢谢,这看起来很有趣。但是,我无法放弃如何使用该库。我这样做了const readFile = _.wrapCallback(fs.readFile); const stream = _(['myfile.txt']).map(readFile).parallel(2);,但不知道如何获取数据
    • 尝试提供的示例代码。提供给_.each() 的回调将使用每个分隔块的内容调用,然后您可以split 逐行处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 2023-03-19
    • 2011-04-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多