Разбор текстового файла построчно, пропуская определенные строки - PullRequest
1 голос
/ 15 июня 2011

У меня есть файл, который выглядит так (но намного больше):

>some text
ABC
DEF
GHI
>some more text
JKL
MNO
PQR

Я какое-то время играл с ним в Java и смог построить массивы со строками и т. Д. Строки с '>' обычно представляют собой одну строку, но иногда могут быть 2, 3 или более строк. Строки, которые не начинаются с «>», имеют одинаковую длину в символах, но их может быть 10, 20 или 30 или более. Сейчас я нахожусь в точке, где я хочу создать массив строк, где каждая строка в массиве содержит строку строк, которые не начинаются с '>', например:

array element 1 = ABCDEFGHI
array element 2 = JKLMONPQR

Я чувствую, что я близко, но мне нужен небольшой удар в зад, чтобы заставить меня двигаться. Я уверен, что это легко для профессионала, но я все еще новичок в Java.

Конкретная проблема связана с другими постами, которые я сделал на этой доске. Это файл FASTA:

>3BHS_BOVIN (P14893) 3 beta-hydroxysteroid
AGWSCLVTGGGGFLGQRIICLLVEEKDLQEIRVLDKVFRPEVREEFSKLQSKIKLTLLEG
DILDEQCLKGACQGTSVVIHTASVIDVRNAVPRETIMNVNVKGTQLLLEACVQASVPVFI
>41_BOVIN (Q9N179) Protein 4.1 
MHCKVSLLDDTVYECVVEKHAKGQDLLKRVCEHLNLLEEDYFGLAIWDNATSKTWLDSAK
EIKKQVRGVPWNFTFNVKFYPPDPAQLTEDITRYYLCLQLRQDIVSGRLPCSFATLALLG
SYTIQSELGDYDPELHGADYVSDFKLAPNQTKELEEKVMELHKSYRSMTPAQADLEFLEN
>5NTD_BOVIN (Q05927) 5'-nucleotidase 
MNPGAARTPALRILPLGALLWPAARPWELTILHTNDVHSRLEQTSEDSSKCVNASRCVGG
VARLATKVHQIRRAEPHVLLLDAGDQYQGTIWFTVYKGTEVAHFMNALGYESMALGNHEF
DNGVEGLIDPLLKEVNFPILSANIKAKGPLASKISGLYSPYKILTVGDEVVGIVGYTSKE
TPFLSNPGTNLVFEDEITALQPEVDKLKTLNVNKIIALGHSGFEVDKLIAQKVKGVDVVV

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

Ответы [ 4 ]

2 голосов
/ 15 июня 2011

Предполагая, что вы можете перебирать строки:

List<String> array = new ArrayList<String>();
StringBuilder buf = new StringBuilder();
for (String line : lines) {
  if (line.startsWith(">")) {
    if (buf.length() > 0) {
      array.add(buf.toString());
      buf.setLength(0);
    }
  } else {
    buf.append(line);
  }
}
if (buf.length() > 0) { // Add the final text element(s).
  array.add(buf.toString());
}
2 голосов
/ 15 июня 2011

Как то так?

Array<String> lines    
 //Open the file for reading
    try {    
       BufferedReader br = new BufferedReader(new FileReader(<FileNameGoesHere>));
       while ((thisLine = br.readLine()) != null) { // while loop begins here
         if(thisLine.charAt(0) != '>') {
           lines.add(thisLine);
         }
       } // end while 
     } // end try
     catch (IOException e) {
       System.err.println("Error: " + e);
     }
2 голосов
/ 15 июня 2011

Попробуй это.Я не беспокоился о правильных именах переменных.Также это работает, если в первой строке есть>.Вероятно, он тоже не оптимизирован, но должен дать вам представление о том, как это возможно.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;


public class Parse {
    public static void main(String[] args) throws IOException {
        String lala = ">some text\r\n" + 
                "ABC\r\n" + 
                "DEF\r\n" + 
                "GHI\r\n" + 
                ">some more text\r\n" + 
                "JKL\r\n" + 
                "MNO\r\n" + 
                "PQR";

        ArrayList<String> lines = new ArrayList<String>();

        BufferedReader in = new BufferedReader( new StringReader( lala ) );

        String line;
        while( ( line = in.readLine() ) != null ) {
            lines.add( line );
        }

        ArrayList<String> parsed = new ArrayList<String>();

        for( String s : lines ) {
            if( s.contains(">") ) {
                parsed.add("");
            } else {
                String current = parsed.get( parsed.size() - 1 );
                parsed.set( parsed.size() - 1, current + s );
            }
        }

        for( String s : parsed ) {
            System.out.println( s );
        }
    }

}

Выше приведено:

ABCDEFGHI
JKLMNOPQR

Еще один интересный способ сделать это - наЦикл 'in.readLine ()' вы можете проверить на наличие> и, если он существует, добавить <в конце этой строки, прежде чем вставлять его в «строки».Затем вы можете использовать регулярное выражение, чтобы позже вытащить другие строки. </p>

0 голосов
/ 15 июня 2011

пропустить строки, начинающиеся с >, легко;

while((line=istream.readLine())!=null){
    if(line.charAt(0)=='>')continue;

    //do normal concat to buffers
}

, если вы хотите перейти к следующему буферу в строках, начинающихся с >, это немного сложнее

while((line=istream.readLine())!=null){
    if(line.charAt(0)=='>'){
         //create new buffer and append the current one to the list (check first if current one is not empty)
         continue;
    }

    //do normal concat to buffer
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...