2016-09-14 52 views
1

我試圖使用中的splitby方法來提取開始和結束分隔符之間的數據。讀取大文件和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

這裏真的有三個問題。

  1. 從文件
  2. 提取的分隔塊
  3. 獲取得到的數據進行流首先

閱讀的內容數據,你需要閱讀每一個文件的內容。請注意,包裹readFile將發出Buffers,而不是Strings。要提取塊,您需要將每個文件的內容轉換爲String。我假設文件編碼爲utf-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' 
] 

要獲得此結果我使用正則表達式與兩個不匹配的分隔符組和數據匹配組。首先,我提取分隔的塊,然後刪除分隔符。這可能不是非常有效,但應該完成這項工作。請注意0​​的回調將返回一個字符串數組。在這裏使用map會導致數組流 - 每個文件一個。我們想要的是一串字符串。這就是爲什麼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 
)