我有一个格式化的文本文件,我需要从该文本文件中提取信息并将其放入类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”);