为什么我的程序没有正确识别姓氏?

时间:2015-09-06 18:31:10

标签: java

扫描程序读取错误的数据,文本文件格式为:

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

我该如何解决?

2 个答案:

答案 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),
  • 自己换行,
  • Unicode全角逗号(\uff0c)。

这些是我们想要分隔文本的字符。我已经指定了两种类型的行结尾,因为我不确定您的文件使用哪种行结尾。

我还设置扫描仪在从文件读取时使用UTF-8编码。我不知道这对你有什么影响,但在我的系统上,UTF-8不是默认编码,所以我需要指定它。

答案 1 :(得分:0)

首先,请交换fileNamefile。接下来,我建议您使用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();
}