首页 > 解决方案 > csvReader 在读取 csv 文件时跳过第一列每一行的第一个字母

问题描述

我用 Java 写了一个 csvReader 方法。一切似乎都工作正常,但它只是在打印值时跳过第一列中每一行的第一个字母。这是我的代码=>

public static void csvReader(String fileName) {

    try {
        BufferedReader fileReader = new BufferedReader(new FileReader(fileName));
        List<Student> students = new ArrayList<>();
        fileReader.readLine();

        while (fileReader.read() > 0) {
            String line = fileReader.readLine();
            String[] tokens = line.split(COMMA_DELIMETER);

            if (tokens.length > 0) {
                Student student = new Student(tokens[0], tokens[1], Integer.valueOf(tokens[2]),
                        Integer.valueOf(tokens[3]));
                students.add(student);
            }
        }

        students.forEach(System.out::println);

    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

这里的“Student”只是一个 POJO 类,具有 firstName、lastName、id 和 age 字段。在我得到输出为 =>

Student details : ID = 101 first name = ikhil Last name = Chaurasia age = 28
Student details : ID = 102 first name = adhna Last name = Chaurasia age = 28

结果应该是这样的=>

Student details : ID = 101 first name = Nikhil Last name = Chaurasia age = 28
Student details : ID = 102 first name = Sadhna Last name = Chaurasia age = 28

csv文件内容如下所示:

csv_file.csv

toString 方法的实现如下所示:

public String toString() {
    return "Student details : ID = "+id+ " first name = "+firstName+ " Last name = "+lastName+ " age = "+age;
}

任何帮助将不胜感激。谢谢

标签: javacsv

解决方案


问题在于您的while循环条件:fileReader.read() > 0.

每次调用它时都会读取一个字符(例如'N','S'),这会导致后续调用readLine跳过第一个字符。

相反,只需使用以下命令检查条件readLine

String line;
while ((line = fileReader.readLine()) != null) {
  String[] tokens = line.split(COMMA_DELIMETER);
  // do the rest of the stuff
}

推荐阅读