2016-04-16 139 views
1

我有一個文本文件如下:爪哇 - 讀文本文件

Past Dues/Refunds/Subsidy 
Arrears/Refunds 
Amount 
2013.23 
Period to which 
it relates 
Since OCT-15 

現在,我該如何在「量」的下一行提取數據。 我已經嘗試過使用布爾值,檢查上面和下面的行。

有沒有其他方法可以做到這一點。

我的代碼:

boolean isGroup=false; 
while(line = br.readline() != null){ 
    if(line.equals("Amount"){ 
     isGroup=true; 
    } 
    if(line.equals("Period to which") && isGroup) 
     isGroup=false; 
    if(isGroup){ 
     //read line and check whether it is null or not 
     String amount = line; 
    } 
} 

請幫助。謝謝

+2

所以你使用布爾並檢查上面的行嘗試。這應該工作。你用這種方法問題是什麼?爲什麼你想要一個不同的方法?你看到一個錯誤? – nhouser9

+0

theres沒有錯那個方法爲什麼最新的問題? – Priyamal

+0

@ nhouser9在問題中看到我的代碼。這太長了,因爲我提取的數據太多。有沒有更簡單的方法? – Dax

回答

2

你的方法非常好。你通過設置布爾值而犯了一個小錯誤,然後在循環的相同迭代中使用。

如果執行以下操作,應該罰款:

String amount = "No amount found"; 
boolean isGroup=false; 
while(line = br.readline() != null) { 
    // Check all your conditions to see if this is the line you care about 
    if(isGroup){ 
     amount = line; 
     isGroup = false; // so you only capture this once 
     continue; 
    } 
    else if (isOtherCondition) { 
     // handle other condition; 
     isOtherCondition = false; // so you only capture this once 
     continue; 
    } 

    // Check the contents of lines to see if it's one you want to read next iteration 
    if(line.equals("Amount"){ 
     isGroup=true; 
    } 
    else if (line.equals("Some Other Condition")) { 
     isOtherCondition = true; 
    } 
} 

這是你所需要的。 break;就是這樣,您不必擔心在獲取金額後發生的情況。

+0

'break;'會帶我離開while循環,如果我的循環也包含其他一些任務,那該怎麼辦?我可以使用'continue;'跳轉到下一行迭代嗎? – Dax

+0

是啊...讓我更新答案,以便您可以完成其他任務。 – xbakesx

+0

例如,我想提取「金額」旁邊的行以及「它涉及」的下一行。 – Dax

1

如果文件是平均大小,您可以使用正則表達式。
只需在整個文件中讀入一個字符串即可。
要使用正則表達式就像這樣。
結果是捕獲組1

"(?mi)^\\s*Amount\\s+^\\s*(\\d+(?:\\.\\d*)?|\\.\\d+)\\s*$"

(?mi)      # Multi-line mode, case insensitive 
^       # Beginning of line 
\s* Amount \s+ 
^       # Beginning of line 
\s* 
(      # (1 start), Numeric value 
     \d+ 
     (?: \. \d*)? 
    | \. \d+ 
)       # (1 end) 
\s* 
$       # End of line 
+0

您能詳細說明我該如何使用這個regrex? – Dax

+0

@dax基於sln的正則表達式來查看我的回答 – Riz

+0

@Dax - Google Java regex。我想你可以將文件讀入一個字符串,然後運行一個'FindAll'或'Match',它將返回一個值數組。我不使用Java正則表達式,但我一直在寫它們。這可以充實以獲得更多的記錄值,但是記錄結構需要更多的值。 – sln

1

這是你會怎麼做@sln答案在Java中

String text = "Past Dues/Refunds/Subsidy\n" + 
"Arrears/Refunds\n" + 
"Amount\n" + 
"2013.23\n" + 
"Period to which\n" + 
"it relates\n" + 
"Since OCT-15"; 

Pattern pattern = Pattern.compile("(?mi)^Amount\\s(?<amount>\\d+\\.\\d{2})"); 
Matcher matcher = pattern.matcher(text); 

if(matcher.find()){ 
    String amount = matcher.group("amount"); 
    System.out.println("amount: "+ amount); 
} 
+0

明白了。謝謝 – Dax

+0

不錯。我也喜歡短數字部分。 – sln