2011-06-14 155 views
1

我有一個看起來像這樣(但更大)的文件:解析文本文件一行行,跳過某些行

>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 

我最終需要在他們自己的數組元素中的序列,以便我可以稍後操作它們。

+0

什麼是* *的具體問題?你知道如何連接字符串嗎?你知道如何識別一個字符串是否以'>開頭'''? – 2011-06-14 23:11:55

+1

我有一個文件行的數組,我可以確定哪些以'>'開頭,是的...我也可以連接行,但只選擇那些並將它們作爲數組中的元素是我的位置遇到麻煩。 – nicorellius 2011-06-14 23:16:24

回答

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

這是一個很好的解決方案。看起來很緊密和高效,除了一件事。對於測試,由於我使用的是具有三個條目的文件,因此如果我打印數組,我只能得到前兩個條目,如果我打印buf,則會得到第三個條目。這是一個很好的開始,現在我正在與它一起工作,看看我是否能夠一直工作。也許我錯過了什麼? – nicorellius 2011-06-15 00:54:10

+0

@nicorellius:哎呀,對,我忘了在循環結尾沖洗緩衝區;看我更新的解決方案。 – maerics 2011-06-15 02:14:38

+0

不錯!我認爲這有點不合適。儘管如此,你做到了完美; - )再次感謝這個偉大的迴應。 – nicorellius 2011-06-15 05:17:47

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()」循環中,您可以檢查>,如果它存在添加<在將該字符串推到'行'之前的字符串末尾。然後你可以使用正則表達式來抓取其他線。

+0

爲什麼要先將行添加到數組中,然後再次遍歷數組以刪除不必要的條目而不是添加有用的行?太複雜了imo – Voo 2011-06-14 23:31:13

+0

你可以這樣做。這有點棘手,因爲你可能不得不倒退,因爲你會從列表中刪除條目。我想這是偏好。我不同意我的方法比你所建議的方法複雜得多。 – 2011-06-14 23:39:04

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