2016-04-16 5 views
1

Ich habe eine Textdatei wie folgt:Java - Lesetextdatei

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

Nun, wie ich die Daten in der nächsten Zeile von „Betrag“ zu extrahieren. Ich habe es versucht mit Boolean, Überprüfung der oben und unten Zeile.

Gibt es einen anderen Weg, es zu tun.

Mein Code:

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

Bitte um Hilfe. Danke

+2

So versuchte man durch die Verwendung eines boolean und die Überprüfung der oben genannten Zeile tun würde . Das sollte funktionieren. Was ist dein Problem mit dieser Methode? Warum willst du eine andere Methode? Siehst du einen Fehler? – nhouser9

+0

theres nichts falsch mit dieser Methode, warum ist das Problem? – Priyamal

+0

@ nhouser9 siehe meinen Code in der Frage. Es ist zu lang, da ich zu viele Daten extrahiert habe. Gibt es einen kürzeren Weg? – Dax

Antwort

2

Ihr Ansatz ist völlig in Ordnung. Sie haben einen kleinen Fehler gemacht, indem Sie den Booleschen Wert gesetzt haben und dann die gleiche Iteration der Schleife verwendet haben.

Wenn Sie folgendermaßen vorgehen Sie sollte in Ordnung sein:

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

Das ist alles was Sie brauchen. Die break; ist nur so, dass Sie sich keine Gedanken darüber machen müssen, was passiert, nachdem Sie den Betrag genommen haben.

+0

'break;' wird mich aus der while-Schleife entfernen, was ist, wenn meine Schleife auch einige andere Aufgaben enthält. Kann ich 'continue;' verwenden, um zur nächsten Zeileniteration zu springen? – Dax

+0

Ja ... lass mich die Antwort aktualisieren, damit du andere Aufgaben erledigen kannst. – xbakesx

+0

zum Beispiel, ich möchte die Zeile neben "Betrag" sowie die nächste Zeile zu "es betrifft" extrahieren. – Dax

1

Wenn die Datei eine durchschnittliche Größe hat, können Sie eine Regex verwenden.
Lesen Sie einfach die gesamte Datei in eine Zeichenfolge.
Um eine Regex zu verwenden, wäre es so etwas.
Ergebnis ist in Capture-Gruppe 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

Können Sie erläutern, wie ich dieses Regrex verwenden kann? – Dax

+0

@dax siehe meine Antwort oben basierend auf der Regex von snr – Riz

+0

@Dax - Google Java regex. Ich denke, Sie könnten einfach die Datei in eine Zeichenfolge lesen, dann eine 'FindAll' oder' Match' ausführen und es wird ein Array von Werten zurückgeben. Ich benutze keine Java Regex, aber ich schreibe sie die ganze Zeit. Dies könnte ausgearbeitet werden, um mehr Werte eines Datensatzes zu erhalten, aber mehr in Bezug auf die Datensatzstruktur benötigt wird. – sln

1

dies ist, wie Sie @sln Antwort in 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

Verstanden. Danke – Dax

+0

Schön. Ich mag auch den kurzen numerischen Teil. – sln