2016-07-20 19 views
-3

Ich habe eine Textdatei, die Zeilen aus Strings enthält, gefolgt von zwei Zahlen, die durch einen Doppelpunkt getrennt sind. Zum Beispiel:Nummer aus einer formatierten Textdatei extrahieren Java

................... 
words 1:1 
morewords 2:1 
something 3:1 
else 4:2 
elsewhere 5:2 
.................... 
middleItem 313 : 60 
middleOther 314 : 60 
...................... 
secondToLast 138714 : 29698 
last 138715 : 29698 
....................... 

Ich möchte in der Lage sein, die Zahl auf der linken und rechten Seite des Dickdarms zu extrahieren und in der Lage sein, sie als Ganze Zahlen zu lesen. Ich muss in der Lage sein, diese int-Zahlen zu verwenden, um später eine Berechnung durchzuführen, also würde es nicht helfen, sie als String zu lesen.

Ich habe versucht, Teilstrings und Regex-Ausdrücke zu verwenden, bin aber nicht in der Lage, ein geeignetes Mittel dafür herauszufinden. Irgendwelche Tipps wären hilfreich!

+0

Scanner.nextInt –

+3

der Regex dafür ist ziemlich einfach. zeig was du probiert hast. – njzk2

+0

Posten Sie, was Sie bisher versucht haben. – K48

Antwort

1
Scanner sc = new Scanner(<OUR_FILE>) 
sc.nextInt() 
1
Scanner s = new Scanner("file"); // A delimiter can also be used to separate lines 
while (s.hasNext()) { 
    if (s.hasNextInt()) { 
     int a = (s.nextInt()); // found integer 
    } else { 
     s.next(); // read the next token 
    } 
} 
0

Ich bin sicher, dass es einen besseren Weg, aber was mir in den Sinn kommt zuerst mit

scanner.nextInt() = variable1, 
scanner.nextInt() = variable2 

und so weiter. Dann schreiben Sie alle Ihre Logik und Berechnungen mit den Variablen, die Sie zuweisen.

Dies (in Kombination mit der Antwort von poorvankBhatia) sollte Ihnen die Verwendung des gesamten Dokuments ermöglichen.

1

können Sie Streams verwenden, um eine Karte zu erstellen, dass bildet jedes Wort zu einem Pair<Integer, Integer>:

Pattern p = Pattern.compile("^(\\w+)\\s+(\\d+)\\s*:\\s*(\\d+)$"); 

Path input = Paths.get("input.txt"); 
try(BufferedReader br = Files.newBufferedReader(input)) { 
    Map<String, Pair<Integer, Integer>> map 
     = br.lines() // Get Stream of lines 
      .map(String::trim) // Safety trim 
      .map(p::matcher) // Get mathcer for each line 
      .filter(Matcher::find) // Filter on lines that match 
      .collect(// Collect into map 
       Collectors.toMap(
        m -> m.group(1), // The word is the key 
        // Maps to a Pair of the 2 integers 
        m -> new Pair<>(Integer.valueOf(m.group(2)), Integer.valueOf(m.group(3))) 
       ) 
      ); 

    /* Usage */ 
    Pair<Integer, Integer> pair = map.get("middleItem"); 
    System.out.println(pair.getKey()); // 313 
    System.out.println(pair.getValue()); // 60 
} catch(IOException e) { 
    e.printStackTrace(); 
} 

Als Anmerkung: regex nicht meine Spezialität ist, so könnte es besser Muster sein.

Verwandte Themen