扫描程序读取错误的数据,文本文件格式为:
111,Smith,Sam, 40,10.50 330,Jones,Jennifer,30,10.00
该计划是:
public class P3 {
public static void main(String[] args) {
String file=args[0];
File fileName = new File(file);
try {
Scanner sc = new Scanner(fileName).useDelimiter(", ");
while (sc.hasNextLine()) {
if (sc.hasNextInt( ) ){ int id = sc.nextInt();}
String lastName = sc.next();
String firstName = sc.next();
if (sc.hasNextInt( ) ){ int hours = sc.nextInt(); }
if (sc.hasNextFloat()){ float payRate=sc.nextFloat(); }
System.out.println(firstName);
}
sc.close();
} catch(FileNotFoundException e) {
System.out.println("Can't open file "
+ fileName + " ");
}
}
}
输出结果为:
40,10.50
330,Jones,Jennifer,30,10.00
应该是:
Sam
Jennifer
我该如何解决?
答案 0 :(得分:3)
问题是您的数据不是用逗号分隔的。它也由行结尾分隔,也由Unicode character U+FF0C(FULLWIDTH COMMA)分隔。
我拿了你的代码,换成了
行 Scanner sc = new Scanner(fileName).useDelimiter(", ");
与
Scanner sc = new Scanner(fileName, "UTF-8").useDelimiter(", |\r\n|\n|\uff0c");
然后运行它。它产生了它应该产生的输出。
文本, |\r\n|\n|\uff0c
是一个与之匹配的正则表达式:
\r
)后跟新行(\n
),\uff0c
)。这些是我们想要分隔文本的字符。我已经指定了两种类型的行结尾,因为我不确定您的文件使用哪种行结尾。
我还设置扫描仪在从文件读取时使用UTF-8编码。我不知道这对你有什么影响,但在我的系统上,UTF-8不是默认编码,所以我需要指定它。
答案 1 :(得分:0)
首先,请交换fileName
和file
。接下来,我建议您使用try-with-resources
。如果您打算使用它们,您的变量需要处于共同范围。最后,在使用hasNextLine()
时,我会致电 nextLine
,您可以在可选白色 split
空格和逗号。这可能看起来像
String fileName = // ...
File file = new File(fileName);
try (Scanner sc = new Scanner(file)) {
while (sc.hasNextLine()) {
String line = sc.nextLine();
String[] arr = line.split("\\s*,\\s*");
int id = Integer.parseInt(arr[0]);
String lastName = arr[1];
String firstName = arr[2];
int hours = Integer.parseInt(arr[3]);
float payRate = Float.parseFloat(arr[4]);
System.out.println(firstName);
}
} catch (FileNotFoundException e) {
System.out.println("Can't open file " + fileName + " ");
e.printStackTrace();
}