我有一个格式化的文本文件,我需要从该文本文件中提取信息并将其放入类Item(1行文本= 1 Item)中的相应成员变量中。
我正在使用扫描仪和定界符,但它只能识别;分隔信息,而不能识别新行。

我尝试了几种不同的regex表达式,而我最近的表达式表达式位于下面,我仅指定知道的分隔符。我也尝试过正则表达式[;\\n]。我唯一的结论是,扫描程序对待换行符的方式与其他字符不同(我知道它具有基于换行符的功能)。

这是文本文件格式

1000;Knock Bits;88;12.67;8015
1001;Widgets;10;35.50;8004
1002;Grommets;20;23.45;8001


这是我的代码的样子

while (scan.hasNext())
{
Item item = new Item();
scan.useDelimiter("[;]");

item.setID(scan.nextInt());
item.setName(scan.next());
item.setQuantity(scan.nextInt());
item.setPriceInCents((int) scan.nextFloat()*100);

scan.useDelimiter("\\n");
item.setSupplierID(scan.nextInt());
}


以上所有代码均有效,除了最后一行使用nextInt()获取SupplierID之外。我知道我可以用

item.setSupplierID(Integer.parseInt(scan.nextLine()));


但这有点丑陋,应该有一种方法使用正则表达式来完成,而不必专门为最后一个单词定制一行。最好只对整个循环使用一个定界符。

最佳答案

使用scanner.useDelimiter(“ [; \ n]”);或scan.useDelimiter(“ [; \ r \ n]”);在Windows和Linux系统上均可使用。

在while循环外调用它:

    scanner.useDelimiter("[;\r\n]");

    while (scanner.hasNext()) {
        Item item = new Item();
        item.setID(scanner.nextInt());
        item.setName(scanner.next());
        item.setQuantity(scanner.nextInt());
        item.setPriceInCents((int) scanner.nextFloat()*100);
        item.setSupplierID(scanner.nextInt());
    }


如果按照mypetlion的建议使用\ R:scan.useDelimiter(“; | \\ R”);

09-11 20:17