2016-01-06 2 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 для чтения моего файла. Я почти понял это с помощью меток() и 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); 
} 

Этот фрагмент кода должен найти теги и сцепить описания, которые охватывают более чем одну строку. Некоторые ответы, которые я нашел здесь, советуют использовать сканер. Это не вариант для меня. Файлы, с которыми я работаю, могут быть очень большими (наибольший из которых я столкнулся> 50 ГБ), и используя BufferedReader, я хочу уменьшить нагрузку на свою систему.

ответ

0

Предлагаю аккумулировать информацию, которую вы получаете, когда прочитали ее в парсера с одним проходом. Это будет проще и быстрее в этом случае, я подозреваю.

Кстати, вы хотите кэшировать свои шаблоны, так как их создание довольно дорого. Вы можете обнаружить, что в некоторых случаях вы хотите использовать их полностью.

0

Код начинается с поиска строки продолжения и вызова reset(), если он не находит его, но код, который читает дополнительные строки, похоже, не делает этого. Может ли он прочитать начало другого раздела в файле Genbank и не вернуть его обратно? Я не вижу здесь всего кода управления контуром, но то, что я вижу, кажется правильным.

Если все остальное терпит неудачу, и вам нужно что-то простое, всегда есть BioJava (см. How to Read a Genbank File with Biojava3 и посмотрите, поможет ли он). Я попытался использовать BioJava для своих собственных проектов, но он всегда падает немного.

Когда я написал парсеры FASTA и FASTQ, я прочитал буфер byte или char и обработал его таким образом, но есть больше кода управления буфером для записи. Таким образом, мне не нужно беспокоиться о том, чтобы вернуть байты в буфер. Это также позволяет избежать регулярного выражения, которое может быть дорогостоящим в критическом по времени приложении. Конечно, для этого требуется больше времени.

Совет: для быстрой реализации, если вы сами управляете буфером, ознакомьтесь с NIO (Java NIO Tutorial). В некоторых случаях я видел отказ от 10-кратного ускорения (запись данных). Единственным недостатком является то, что я еще не нашел простой способ считывать данные с последовательной кодировкой с помощью NIO.

Смежные вопросы