使用扫描程序和JAVA中的多个分隔符从文本文件中读取数据

时间:2013-10-30 22:05:19

标签: java regex parsing java.util.scanner

我有一个包含以下数据的文本文件:

20;
1: 39, 63;
2: 33, 7;
16: 33, 7;
3: 45, 27;
4: 8, 67;
5: 19, 47;
6: 15, 40;
...
20: 65, 54;

第一个整数是列表中的条目数量。

每一行都是一个条目。因此,条目1分别具有x y坐标39和63。 我知道我可以使用不同的分隔符来读取数据,但我不太清楚如何实现这一点。目前我正在使用split()

以下代码读取每一行,但这显然不起作用,因为分隔符未正确设置。是否有一种很好的方法可以让它发挥作用?

String[] temp = sc.next().split(";");
int productAmount = Integer.parseInt(temp[0]);
sc.nextLine();

for (int i = 0; i < productAmount; i++) {
    int productID = sc.nextInt();
    int x = sc.nextInt();
    int y = sc.nextInt();
    Product product = new Product(x, y, productID);
    productList.add(product);
}

3 个答案:

答案 0 :(得分:1)

从中移除最后一个字符后,可以将所有标记转换为整数。您可以使用给定数据的此属性。定义这样的方法:

int integerFromToken(String str) {
    return Integer.valueOf(str.substring(0, str.length() - 1));
}

返回令牌的整数部分(39,返回3963;返回63等。现在使用该方法从标记获取整数值(使用sc.next()获得):

int productID = integerFromToken(sc.next());
int x = integerFromToken(sc.next());
int y = integerFromToken(sc.next());

答案 1 :(得分:1)

如果您使用

String[] temp = sc.next().split("[ ,:;]");

然后您的temp变量将只保留数字。字符串"[ ,:;]"regular expression,这意味着方括号中的任何字符都是分隔符。

答案 2 :(得分:0)

非常类似 Croo 所说的,但是当我使用他的方法时出现编译错误。

为了避免通过将空格作为分隔符来匹配空字符串,我允许它们并使用对trim的调用来摆脱它们更有意义。

同样有用的是知道Scanner可以被赋予regex表达式作为分隔符,然后调用next可以用来导航输入。

sc.useDelimiter("[,:;]");
int productAmount = Integer.parseInt(sc.next());
int x, y, productID, i;
for (i = 0; i < productAmount; i++) {
    productID = Integer.parseInt(sc.next().trim());
    x = Integer.parseInt(sc.next().trim());
    y = Integer.parseInt(sc.next().trim());
    productList.add(new Product(x,y,productID));
}