java - 为什么我的程序无法正确识别姓氏?

标签 java

扫描仪读取到错误数据,文本文件格式为:

111,Smith,Sam, 40,10.50
330,Jones,Jennifer,30,10.00

The program is:

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

如何修复它?

最佳答案

问题在于您的数据不仅仅由逗号分隔。它也由行结束符和 Unicode character U+FF0C 分隔。 (全角逗号)。

我拿走了你的代码,替换了该行

    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 不是默认编码,因此我需要指定它。

关于java - 为什么我的程序无法正确识别姓氏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32426892/

相关文章:

java - 为什么 `.read()` 一个数字的方法返回不同的数字

java - Axis Webservice 调用有时会失败,access.log 显示内容!

java - 将Java中的长字符串写入文件

java - Java Swing 上的 Facebook 共享按钮

java - Java 中的克隆()

java - 泛型与泛型数组列表?

java - 如何找出线程处于等待状态的时间

java - JNA - 获取 OSX 上所有可见的窗口句柄

java - JNI 缓存的 jclass 全局引用变量被垃圾收集?

Java CMS 垃圾收集器日志输出