2016-01-06 56 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读取压缩的序列数据。

相关问题