如何扫描这一行并使用scan.skip()?
How to scan this line and use scan.skip()?
我有一个 .txt 文件,其中包含以下格式示例的行:torch ; 3.0 ; 23.0
我想扫描它以便将第一项放在字符串中,将第二项和第三项放在浮点数中。
这是我目前所做的,但 scan.skip(" ; ")
不起作用,我也尝试过 scan.skip(Pattern.compile(" ; ")
但它也不起作用。
File file = new File(dir);
try {
Scanner scan = new Scanner(file);
scan.skip(" ; ");
scan.useDelimiter(Pattern.compile(" ; "));
while (scan.hasNextLine()) {
String s = scan.next();
float f1 = scan.nextFloat();
float f2 = scan.nextFloat();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
你有什么解决办法吗?
谢谢
不要更改用于阅读 File
的 Scanner
的分隔符。相反,实例化一个内部 Scanner
来解析您从文件中读取的行。另外,我会使用 try-with-Resources
来确保 Scanner
(和 File
)已关闭。喜欢,
File file = new File(dir);
try (Scanner scan = new Scanner(file)) {
while (scan.hasNextLine()) {
Scanner lineScan = new Scanner(scan.nextLine());
lineScan.useDelimiter(Pattern.compile("\s*;\s*"));
String s = lineScan.next();
float f1 = lineScan.nextFloat();
float f2 = lineScan.nextFloat();
System.out.printf("%s %.2f %.2f%n", s, f1, f2);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
你可以使用;
或\n
作为分隔符,不需要跳过,我也建议使用Float.parseFloat(scan.next());
Scanner scan = new Scanner(file);
scan.useDelimiter(Pattern.compile("[;\n]"));
while (scan.hasNextLine()) {
String s = scan.next();
float f1 = Float.parseFloat(scan.next());
float f2 = Float.parseFloat(scan.next());
System.out.println(s + " " + f1 + " " + f2);
}
提供的答案 or 将解决您的问题。
不过,我想解释一下为什么 你的代码 不起作用,你如何让它起作用。
Have a look 在 Scanner#skip(String pattern)
文档中说:
If a match to the specified pattern is not found at the current position, then no input is skipped and a NoSuchElementException is thrown.
因此,您的 scan.skip(" ; ");
阻塞线程,并继续读取标记,直到 您的输入匹配指定模式 (;
) 以跳过,或抛出 NoSuchElementException
。
如果您想使用 .skip(..)
,您只需更改方法调用的顺序即可,例如:
try {
Scanner scan = new Scanner(file);
while (scan.hasNextLine()) {
String s = scan.next();
scan.skip(" ; ");
float f1 = scan.nextFloat();
scan.skip(" ; ");
float f2 = scan.nextFloat();
}
}
我有一个 .txt 文件,其中包含以下格式示例的行:torch ; 3.0 ; 23.0
我想扫描它以便将第一项放在字符串中,将第二项和第三项放在浮点数中。
这是我目前所做的,但 scan.skip(" ; ")
不起作用,我也尝试过 scan.skip(Pattern.compile(" ; ")
但它也不起作用。
File file = new File(dir);
try {
Scanner scan = new Scanner(file);
scan.skip(" ; ");
scan.useDelimiter(Pattern.compile(" ; "));
while (scan.hasNextLine()) {
String s = scan.next();
float f1 = scan.nextFloat();
float f2 = scan.nextFloat();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
你有什么解决办法吗? 谢谢
不要更改用于阅读 File
的 Scanner
的分隔符。相反,实例化一个内部 Scanner
来解析您从文件中读取的行。另外,我会使用 try-with-Resources
来确保 Scanner
(和 File
)已关闭。喜欢,
File file = new File(dir);
try (Scanner scan = new Scanner(file)) {
while (scan.hasNextLine()) {
Scanner lineScan = new Scanner(scan.nextLine());
lineScan.useDelimiter(Pattern.compile("\s*;\s*"));
String s = lineScan.next();
float f1 = lineScan.nextFloat();
float f2 = lineScan.nextFloat();
System.out.printf("%s %.2f %.2f%n", s, f1, f2);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
你可以使用;
或\n
作为分隔符,不需要跳过,我也建议使用Float.parseFloat(scan.next());
Scanner scan = new Scanner(file);
scan.useDelimiter(Pattern.compile("[;\n]"));
while (scan.hasNextLine()) {
String s = scan.next();
float f1 = Float.parseFloat(scan.next());
float f2 = Float.parseFloat(scan.next());
System.out.println(s + " " + f1 + " " + f2);
}
提供的答案
不过,我想解释一下为什么 你的代码 不起作用,你如何让它起作用。
Have a look 在 Scanner#skip(String pattern)
文档中说:
If a match to the specified pattern is not found at the current position, then no input is skipped and a NoSuchElementException is thrown.
因此,您的 scan.skip(" ; ");
阻塞线程,并继续读取标记,直到 您的输入匹配指定模式 (;
) 以跳过,或抛出 NoSuchElementException
。
如果您想使用 .skip(..)
,您只需更改方法调用的顺序即可,例如:
try {
Scanner scan = new Scanner(file);
while (scan.hasNextLine()) {
String s = scan.next();
scan.skip(" ; ");
float f1 = scan.nextFloat();
scan.skip(" ; ");
float f2 = scan.nextFloat();
}
}