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

问题描述

|| 我有一个看起来像这样的文件(但更大):
>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
我最终需要在它们自己的数组元素中的序列,以便以后可以对其进行操作。     

解决方法

        假设您可以遍历各行:
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());
}
    ,        尝试这个。我没有理会适当的变量名。假设第一行带有>,它也可以工作。它可能也没有进行优化,但是应该让您知道如何实现。
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()\'循环中,您可以检查>,如果存在,则在该字符串的末尾添加一个<,然后将其压入\'lines \'。然后,您可以使用正则表达式将其他行撤回。     ,        像这样吗
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);
     }
    ,        跳过以“ 7”开头的行很容易;
while((line=istream.readLine())!=null){
    if(line.charAt(0)==\'>\')continue;

    //do normal concat to buffers
}
如果您想转到以ѭ7starting开始的行中的下一个缓冲区,则需要更多的时间
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
}