gpt4 book ai didi

javascript - 读取大文件和splitby方法

转载 作者:太空宇宙 更新时间:2023-11-04 00:34:55 24 4
gpt4 key购买 nike

我正在尝试使用 highland.js 中的 splitby 方法来提取开始和结束分隔符之间的数据。

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

我可以将文件读入流中,如下所示:

        const readFile = _.wrapCallback(fs.readFile);
stream = _(files).map(readFile).parallel(2);

const blob = _(stream).splitBy('-----BEGIN DATA-----')

但是,我似乎无法弄清楚如何处理该文件并提取我需要的数据。

最佳答案

这里确实存在三个问题。

  1. 从文件中读取内容数据
  2. 提取分隔 block
  3. 从流中获取结果数据

首先您需要读取每个文件的内容。请注意,包装的 readFile 将发出 Buffers,而不是 Strings。要提取 block ,您需要将每个文件的内容转换为String。我假设文件编码为 utf-8

其次,您需要将数据与文本的其余部分分开。我假设您只需要开始和结束分隔符之间的 block ,而不需要分隔符本身或任何可能位于分隔符之外的内容,例如:

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

应该导致:

[ '\nMIIEzDCCArSgAwIBAgIVCugKYzMN5ra8zPWxYE8pUU9SxjYSMA0GCSqGSIb3DQEB\nCwUAMHAxCzAJBgNVBAYTAkdCMRUwEwYDVQQIDAxXYXJ3aWNrc2hpcmUxEDAOBgNV\nBAcMB1dhcndpY2sxEDAOBgNVBAoMB0VudHJ1c3QxETAPBgNVBAsMCFBLSSBURUFN\n'
, '\nMIIETzCCAjegAwIBAgIVBShP2Mx74DZEyNKwYZZPGntRmSWnMA0GCSqGSIb3DQEB\nDQUAMHIxCzAJBgNVBAYTAkdCMRUwEwYDVQQIDAxXYXJ3aWNrc2hpcmUxEDAOBgNV\nBAcMB1dhcndpY2sxDDAKBgNVBAoMA0lCTTERMA8GA1UECwwIUEtJIFRFQU0xGTAX\n5/62\n'
]

为了获得此结果,我使用正则表达式,其中两个非匹配组作为分隔符,一个匹配组作为数据。首先,我提取分隔 block ,然后删除分隔符。这可能不是很有效,但应该可以完成工作。

请注意,flatMap 的回调将返回一个字符串数组。在这里使用map会产生一个数组流——每个文件一个。我们想要的是单个字符串流。这就是为什么flatMap这里使用了`。

最后,您需要让流流动并从中获取数据。为此,您需要在流上调用消费方法。在此示例中,我使用 toArray 。提供给此方法的回调将使用包含流的所有元素的数组进行调用 - 在本例中是所有数据 block 。

以下是完整内容:

const Stream = require("highland")
const FS = require("fs")

const files = [ "./input-1.txt", "./input-2.txt" ]
const readFile = Stream.wrapCallback(FS.readFile);

const pattern = /(?:-----BEGIN DATA-----)((.|\n)+?)(?:-----END DATA-----)/gm

Stream(files)
// 1. Read contents
.map(readFile)
.parallel(2)
.invoke("toString", ["utf-8"])
// 2. Process contents to extract data
.flatMap((content) =>
content
// get an array of chunks (including delimiters)
.match(pattern)
// remove the delimiters from each chunk, leaving only the data
.map((chunk) => chunk.replace(pattern, "$1")))
// 3. Get the resulting data out of the stream
.toArray((chunks) =>
console.log(chunks) // will print an array of data chunks
)

关于javascript - 读取大文件和splitby方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39500380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com