逐行解析文本文件,跳过某些行

时间:2011-06-14 23:07:07

标签: java arrays string list

我有一个看起来像这样的文件(但要大得多):

>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 个答案:

答案 0 :(得分:2)

试试这个。我没有使用适当的变量名称。假设第一行有一个>它也可以工作。它可能没有优化,但应该让你知道这是如何可能的。

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()'循环中你可以检查&gt;如果存在则添加&lt;在将它推到'lines'之前,在该字符串的末尾。然后,您可以使用正则表达式稍后再取出其他行。

答案 1 :(得分:2)

这样的东西?

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 :(得分:2)

假设您可以遍历这些行:

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());
}

答案 3 :(得分:0)

跳过以>开头的行很容易;

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
}