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

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

>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新手。

具体问题与我在这个板上做的其他post有关。 这是一个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 

我最终需要在他们自己的数组元素中的序列,以便我以后可以操作它们。

假设您可以遍历这些行:

 List array = new ArrayList(); 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()); } 

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

 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 lines = new ArrayList(); BufferedReader in = new BufferedReader( new StringReader( lala ) ); String line; while( ( line = in.readLine() ) != null ) { lines.add( line ); } ArrayList parsed = new ArrayList(); 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()’循环中你可以检查>,如果它存在,在将它推到’lines’之前在该字符串的末尾加一个<。 然后,您可以使用正则表达式稍后再取出其他行。

像这样的东西?

 Array lines //Open the file for reading try { BufferedReader br = new BufferedReader(new FileReader()); 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); } 

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

 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 }