1

splitbyメソッドを使用しhighland.jsて、開始区切り文字と終了区切り文字の間のデータを抽出しようとしています。

        -----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-----')

ただし、ファイルを処理して必要なデータを抽出する方法がわかりません。

4

1 に答える 1

1

ここには本当に3つの懸念があります。

  1. ファイルからのコンテンツ データの読み取り
  2. 区切られたチャンクの抽出
  3. 結果のデータをストリームから取得する

まず、各ファイルの内容を読み取る必要があります。ラップされたものはではなくreadFileを放出することに注意してください。チャンクを抽出するには、各ファイルのコンテンツを. ファイルは としてエンコードされていると仮定します。BuffersStringsStringutf-8

次に、データを残りのテキストから分離する必要があります。区切り文字自体や区切り文字の外側にある可能性のあるものは含めずに、開始区切り文字と終了区切り文字の間のチャンクのみが必要であると仮定します。たとえば、次のようになります。

-----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'
]

この結果を得るために、区切り文字には一致しない 2 つのグループを、データには一致するグループを 1 つ含む正規表現を使用します。まず、区切られたチャンクを抽出してから、区切り記号を削除します。これはあまり効率的ではないかもしれませんが、うまくいくはずです。

flatMapのコールバックは文字列の配列を返すことに注意してください。ここで使用mapすると、ファイルごとに 1 つの配列のストリームが生成されます。必要なのは、文字列の単一のストリームです。そのため、ここではflatMap ` を使用しています。

最後に、ストリームを流してデータを取得する必要があります。これを行うには、ストリームで消費メソッドを呼び出す必要があります。この例ではtoArrayを使用します。このメソッドに提供されるコールバックは、ストリームのすべての要素 (この場合はすべてのデータ チャンク) を含む配列で呼び出されます。

これがその全体です:

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
  )
于 2016-10-13T15:59:56.940 に答える