2016-01-06 58 views
2

我正在寫一個解析器看起來像這樣的文件:用的BufferedReader(Java)的預讀

LOCUS  SCU49845  5028 bp DNA    PLN  21-JUN-1999 
DEFINITION Saccharomyces cerevisiae TCP1-beta gene, partial cds, and Axl2p 
      (AXL2) and Rev7p (REV7) genes, complete cds. 
ACCESSION U49845 
VERSION  U49845.1 GI:1293613 

我想通過某些標記之前的信息(定義,版本等),但一些描述覆蓋多條線路,我確實需要它。使用BufferdReader讀取我的文件時,這是一個問題。 我幾乎通過使用mark()和reset()來計算出它,但是當執行我的程序時,我注意到它只適用於一個標籤,其他標籤以某種方式被跳過。這是我到目前爲止的代碼:

Pattern pTag = Pattern.compile("^[A-Z]{2,}");//regex: 2 or more uppercase letters is a tag 

Matcher mTagCurr = pTag.matcher(line);     

if (mTagCurr.find()) { 
    reader.mark(1000); 

    String nextLine = reader.readLine(); 
    Matcher mTagNext = pTag.matcher(nextLine);      
    if (mTagNext.find()){ 
     reader.reset(); 
     continue; 
    } 

    Pattern pWhite = Pattern.compile("^\\s{6,}"); 
    Matcher mWhite = pWhite.matcher(nextLine); 
    while (mWhite.find()) { 
     line = line.concat(nextLine); 
    }      
    System.out.println(line); 
} 

這段代碼應該找到標籤和連接說明,涵蓋多行。我在這裏找到的一些答案建議使用掃描儀。這不適合我。我使用的文件可能非常大(我遇到的最大文件大於50GB),並且使用BufferedReader,我希望在系統上減少壓力。

回答

0

我建議您在單遍解析器中讀取信息時累積所獲得的信息。在這種情況下,我懷疑這會更簡單快捷。

順便說一句,你想緩存你的模式,因爲創建它們是非常昂貴的。你可能會發現你想在某些情況下完全使用它們。

0

代碼首先找到一條延續線,如果找不到它,則調用reset(),但讀取其他行的代碼似乎沒有這樣做。是否可以閱讀Genbank文件中另一部分的開頭,而不是放回去?我沒有在這裏看到所有的循環控制代碼,但我所看到的似乎是正確的。

如果一切都失敗了,你需要一些簡單的東西,總是有BioJava(見How to Read a Genbank File with Biojava3,看看它是否有幫助)。我曾嘗試將BioJava用於我自己的項目,但總是有點短。

當我編寫了FASTA和FASTQ解析器時,我讀入了一個bytechar緩衝區並以此方式處理,但是有更多的緩衝區管理代碼需要編寫。這樣,我不必擔心將字節放回緩衝區。這也可以避免正則表達式,這在時間關鍵的應用程序中可能很昂貴。當然,這需要更多時間來實施。

提示:如果您要自己管理緩衝區,要獲得最快實施,請查看NIO(Java NIO Tutorial)。在某些情況下,我看到放棄10倍加速(寫入數據)。唯一的缺點是,我還沒有找到一種簡單的方法來使用NIO讀取壓縮的序列數據。

相關問題