从格式化的文本文件Java中提取数字

时间:2016-07-20 16:56:22

标签: java string file-io int

我有一个文本文件,其中包含字符串后跟两个数字,用冒号分隔。例如:

...................
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
.......................

我希望能够提取冒号左侧和右侧的数字,并能够将它们作为整数读取。我需要能够使用这些int数字稍后执行计算,因此将它们作为String读取将无济于事。

我尝试过使用子字符串和正则表达式,但我无法弄清楚这样做的正确方法。任何提示都会有所帮助!

4 个答案:

答案 0 :(得分:1)

Scanner sc = new Scanner(<OUR_FILE>)
sc.nextInt()

答案 1 :(得分: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
    }
}

答案 2 :(得分:1)

您可以使用流来创建地图,将每个单词映射到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();
}

作为一个注释:正则表达式不是我的专长,所以可能有更好的模式。

答案 3 :(得分:0)

我确定有更好的方法,但我首先想到的是使用

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

等等。然后,使用您指定的变量写出所有逻辑和计算。

这样做(与poorvankBhatia的答案相结合)可以让你使用整个文件。