2015-05-11 9 views
8

Ich habe einen formatierten Text wie folgt aus:Scanning Zahlen aus einer formatierten Text in Java

x.i9j11k2d1" index="603" value="0"/> 
x.i9j11k2d2" index="604" value="0"/> 
x.i9j11k2d3" index="605" value="0"/> 
x.i10j1k1d1" index="606" value="-0"/> 

Und ich in Scanning interessiert bin nur die Ziffern. Zum Beispiel:

int i,j,k,d,index,value; 

Für die erste Zeile möchte ich:

i=9, j=11, k=2, d=1, index=603, value=0 

Zu diesem Zweck habe ich den folgenden Code:

Scanner file=new Scanner(new File("C:/sol.txt")); 
while(file.hasNext()) 
    {   
     System.out.println(""); 
     int i=0; 
     int j=0; 
     int k=0; 
     int d=0; 
     file.useDelimiter("");   
     while(!(file.hasNextInt())) 
     { 
      System.out.print(file.next()); 
     } 
     //System.out.print(file.next()); 
     file.useDelimiter("j"); 
     i=file.nextInt(); 
     System.out.print(i); 
     file.useDelimiter(""); 

     System.out.print(file.next());  //j 
     file.useDelimiter("k"); 
     j=file.nextInt(); 
     System.out.print(j); 
     file.useDelimiter(""); 

     System.out.print(file.next());  //k 
     k=file.nextInt(); 
     System.out.print(k); 
     System.out.print(file.next());  //d 
     d=file.nextInt(); 
     System.out.print(d); 
     while(!(file.hasNextInt())) 
     { 
      System.out.print(file.next()); 
     } 
     file.useDelimiter("\""); 
     int index=file.nextInt(); 
     System.out.print(index); 
     file.useDelimiter(""); 
     while(!(file.hasNextInt())) 
     { 
      System.out.print(file.next()); 
     } 
     int value=file.nextInt(); 
     System.out.print(value); 
     System.out.print(file.nextLine());  
    } 
    file.close(); 
    } 
    catch (FileNotFoundException exc) 
    {System.out.println("File non trovato");} 

Es funktioniert perfectely bis i eine Ziffer ist, aber dann, wenn ich die vierte Zeile scannen muss, weiß ich nicht, warum es das folgende zurückgibt:

die Datei im XML formatiert ist, kann ich nicht die gesamte Datei schreiben weil es Tausende von Zeilen ist, aber es ist wie folgt aus:

<?xml version = "1.0" encoding="UTF-8" standalone="yes"?> 
<CPLEXSolution version="1.2"> 
<header 
    problemName="prob" 
    solutionName="incumbent" 
    solutionIndex="-1" 
    objectiveValue="58.2123812523709" 
    solutionTypeValue="3" 
    solutionTypeString="primal" 
    solutionStatusValue="102" 
    solutionStatusString="integer optimal, tolerance" 
    solutionMethodString="mip" 
    primalFeasible="1" 
    dualFeasible="0" 
    MIPNodes="3285" 
    MIPIterations="22164" 
    writeLevel="1"/> 
    <variables> 
    <variable name="x.i0j1k1d1" index="0" value="0"/> 
    <variable name="x.i0j1k1d2" index="1" value="0"/> 
    <variable name="x.i0j1k1d3" index="2" value="0"/> 
    <variable name="x.i0j1k2d1" index="3" value="1"/> 
    </variables> 
    </CPLEXSolution> 
+0

Sie sind wahrscheinlich besser dran mit einer Regex für diese Art von Problem. – JonasCz

+0

Das Problem scheint mit Ihrem Trennzeichen 'file.useDelimiter (" ")' zu sein, das nichts (Nullgröße) als Trennzeichen verwendet. Bessere Verwendung von RE. –

+2

Dies ist eine der besten Fragen, die ich seit einiger Zeit von einem neuen Benutzer gesehen habe. Godspeed. – snickers10m

Antwort

2

Um es einfach zu verwenden regex zu machen. Mit dem Muster "\ d +" werden alle Zahlen extrahiert, die Sie verwenden können, wenn Sie sie benötigen. Schauen Sie sich den Code an. Muster p entspricht der nächsten Ziffer, Matcher m wendet dieses Muster auf den String an und dann extrahiert die Methode m.find() die nächste Gruppe (Ziffernzahl mit Muster \ d) und hier ist Ihre Nummer.

import java.util.regex.*; 

public class test { 
    public static void main(String[] args) throws Exception { 
     int i = 0,j,k,d,index,value = 0; 
     Pattern p = Pattern.compile("-?\\d+"); 
     Matcher m = p.matcher("x.i9j11k2d1\" index=\"603\" value=\"010\"/>"); 
     if(m.find()) i=Integer.parseInt(m.group()); 
     if(m.find()) j=Integer.parseInt(m.group()); 
     if(m.find()) k=Integer.parseInt(m.group()); 
     if(m.find()) d=Integer.parseInt(m.group()); 
     if(m.find()) index=Integer.parseInt(m.group()); 
     if(m.find()) value=Integer.parseInt(m.group()); 

     System.out.println("i="+i+" value="+value); 
    } 
} 
+0

danke für deine Antwort, aber ich bin mir nicht sicher, ob ich es bekomme (ich bin nicht vertraut mit Regex). Kann ich bitte etwas Erklärung zu Ihrem Code hinzufügen? – jcsun

+0

Lassen Sie mich wissen, wenn Sie mehr brauchen. Aber im Grunde können Sie es so verwenden, wie es ist. – Alex

+0

Das funktioniert perfekt! vielen Dank! Ich sollte unbedingt tiefere Regex studieren!Wie auch immer, nur aus pädagogischen Gründen möchte ich verstehen, warum meine Methode nicht funktioniert. Wenn also jemand mich erleuchten könnte, wäre ich sehr dankbar! – jcsun

Verwandte Themen