【发布时间】:2021-10-14 04:47:14
【问题描述】:
在很长时间没有学习这门语言之后,我正在重新学习 Java 知识,并且我正在使用 OpenCSV for Java。我编写了一个读取具有以下结构的 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;
}
}
我的模型课:
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;
}
}
由于某种原因,当我调试代码时,它返回 4 行而不是 5 行,并且还返回带有 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() 并更新了我的阅读器方法以返回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() 跳过了我正在发送的数据行(我所做的映射是自动完成的)。
【问题讨论】: