OpenCSV:方法在读取 CSV 时返回 null

OpenCSV: Method is returning null when reads the CSV

在很长一段时间没有学习这门语言之后,我正在复习我在 Java 中的知识,并且我正在为 Java 使用 OpenCSV。我写了一个读取具有以下结构的 CSV 文件的方法:

id,first_name,last_name,email,gender,ip_address,date
1,Bear,Picker,bpicker0@wordpress.com,Bigender,33.63.86.239,20/06/2021
2,Emili,McEntee,emcentee1@sciencedirect.com,Bigender,163.127.107.66,03/08/2021
3,Bethena,Fortune,bfortune2@live.com,Genderqueer,52.250.33.22,22/04/2021
4,Mortie,Praten,mpraten3@google.nl,Genderfluid,181.3.231.237,09/07/2021
5,Nappy,Giabucci,ngiabucci4@unc.edu,Female,110.180.139.101,01/06/2021

这是我写的读取文件的基本方法:

public static List<String> readDataLineByLine(String path, Class classModel) {
  try {
      Reader reader = Files.newBufferedReader(Paths.get(path));

      CsvToBean csvToBean = new CsvToBeanBuilder(reader)
              .withType(classModel)
              .withSeparator(',')
              .withSkipLines(1)
              .withIgnoreLeadingWhiteSpace(true)
              .build();

      List<String> results = csvToBean.parse();

      return results;
  } catch(IOException ex) {
      Log.error(ex.toString());
      return null;
  }
}

我的模型class:

public class MockarooFakeModel {

    @CsvBindByName(column = "id")
    private int ID;

    @CsvBindByName(column = "first_name")
    private String firstName;

    @CsvBindByName(column = "last_name")
    private String lastName;

    @CsvBindByName(column = "email")
    private String email;

    @CsvBindByName(column = "gender")
    private String gender;

    @CsvBindByName(column = "ip_address")
    private String IPAddress;

    @CsvBindByName(column = "date")
    private String date;

    public int getID() {
        return ID;
    }

    public void setID(int ID) {
        this.ID = ID;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getIPAddress() {
        return IPAddress;
    }

    public void setIPAddress(String IPAddress) {
        this.IPAddress = IPAddress;
    }

    public Date getDate() {
        try {
            Date date = new SimpleDateFormat("dd/MM/yyyy").parse(this.date);
            return date;
        } catch (ParseException ex) {
            Log.error(ex.toString());
            return null;
        }
    }

    public void setDate(String date) {
        this.date = date;
    }
}

出于某种原因,当我调试代码时,它 return 是 4 行而不是 5 行,而且它 return 是 null 的行。我以为是因为我没有映射模型,但这并没有解决问题。另外,我不认为 TestNG 在我执行测试时会引起一些冲突。

@Test(description = "Gets the data stored in a CSV file")
public void Test4(Method method) {
    startTest(method.getName(),"Gets the data stored in a CSV file");

    var records = Utils.readDataLineByLine("PathToTheFile.csv", MockarooFakeModel.class);
}

对于解决我的问题的任何帮助,我将不胜感激。谢谢!

更新

我忘记勾选复选框来回答我自己的问题,但我在这里留下了我的问题的解决方案(谢谢,@lastzolex)。-

我删除了 .withSkipLines() 并将我的 reader 方法更新为 return a Class:

public static List<Class> readDataLineByLine(String path, Class classModel) {
    try {
        Reader reader = Files.newBufferedReader(Paths.get(path));

        CsvToBean csvToBean = new CsvToBeanBuilder(reader)
                .withType(classModel)
                .withSeparator(',')
                .withIgnoreLeadingWhiteSpace(true)
                .build();

        List<Class> results = csvToBean.parse();

        return results;
    } catch(IOException ex) {
        Log.error(ex.toString());
        return null;
    }
}

我不知道 .withSkipLines() 跳过了我发送的数据行(我做的映射是自动执行的)。

你把问题描述的很好,谢谢!

在我看来,唯一的问题是线路

.withSkipLines(1)

因为您在映射 header 的同时跳过了 header 行。所以库无法匹配任何值。

只需从 lambda 中删除它,您将获得 5 行正确映射的值。