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 行正确映射的值。
在很长一段时间没有学习这门语言之后,我正在复习我在 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 行正确映射的值。