@CsvBindByName - 具有备用列名称的绑定列
@CsvBindByName - Binding column with alternate column name
我有两个 csv 源可以从中读取数据。这两个 csv 文件提供相同的数据,但具有不同的名称或列位置。有没有办法用“或”添加@CsvBindByName。比如两个文件的header如下
CSV 1 - RollNo, StudentName, Class, Age, PrimaryLanguage, ProjectName
CSV 2 - Name, Class, PrimLang, EnrollmentNumber, Age, Project,
AttendancePercentage
而且我必须读取同一个 POJO 中的两个 csv 文件信息。
public class StudentInfo{
@CsvBindByName(column = "RollNo")
private String rollNo;
@CsvBindByName(column = "StudentName")
private String studentName;
@CsvBindByName(column = "PrimaryLanguage")
private String primaryLanguage;
@CsvBindByName(column = "Class")
private String class;
@CsvBindByName(column = "ProjectName")
private String projectName;
@CsvBindByName(column = "Age")
private String age;
//getters and setters
}
或者是否有其他方法可以实现此目的。如果我只采用一种 csv header 格式,我的代码工作正常。谢谢
opencsv 中的 Profiles
解决了这个问题,但它只能从 5.4 开始使用。
参见 Profiles
上的 documentation
以下是官方文档中的代码片段。
public class Person {
@CsvBindByNames({
@CsvBindByName(column = "last name"),
@CsvBindByName(profiles = {"customer 2", "customer 5"})
})
private String surname;
@CsvBindByNames({
@CsvBindByName,
@CsvBindByName(column = "first name", profiles = "customer 1"),
@CsvBindByName(column = "given name", profiles = "customer 2")
})
private String name;
@CsvIgnore(profiles = "customer 2")
@CsvBindByName(column = "middle initial")
private char initial;
@CsvBindByName(column = "salary", profiles = "customer 1")
@CsvBindByName(column = "annual salary", profiles = "customer 2")
@CsvNumber(value = "#0.00", profiles = "customer 1")
@CsvNumber(value = "0.0#E0", profiles = "customer 2")
private float salaryInUSD;
@CsvBindByName(column = "height")
@CsvNumbers({
@CsvNumber("000"),
@CsvNumber(value = "000cm", profiles = "customer 2")
})
private int heightInCentimeters
// Accessor methods go here.
}
// Now, the profile can be used in the builder parse, see below.
List<Person> beans = new CsvToBeanBuilder<Person>(inputfile)
.withProfile("customer 1")
.withType(Person.class)
.build()
.parse();
我有两个 csv 源可以从中读取数据。这两个 csv 文件提供相同的数据,但具有不同的名称或列位置。有没有办法用“或”添加@CsvBindByName。比如两个文件的header如下
CSV 1 - RollNo, StudentName, Class, Age, PrimaryLanguage, ProjectName
CSV 2 - Name, Class, PrimLang, EnrollmentNumber, Age, Project, AttendancePercentage
而且我必须读取同一个 POJO 中的两个 csv 文件信息。
public class StudentInfo{
@CsvBindByName(column = "RollNo")
private String rollNo;
@CsvBindByName(column = "StudentName")
private String studentName;
@CsvBindByName(column = "PrimaryLanguage")
private String primaryLanguage;
@CsvBindByName(column = "Class")
private String class;
@CsvBindByName(column = "ProjectName")
private String projectName;
@CsvBindByName(column = "Age")
private String age;
//getters and setters
}
或者是否有其他方法可以实现此目的。如果我只采用一种 csv header 格式,我的代码工作正常。谢谢
Profiles
解决了这个问题,但它只能从 5.4 开始使用。
参见 Profiles
以下是官方文档中的代码片段。
public class Person {
@CsvBindByNames({
@CsvBindByName(column = "last name"),
@CsvBindByName(profiles = {"customer 2", "customer 5"})
})
private String surname;
@CsvBindByNames({
@CsvBindByName,
@CsvBindByName(column = "first name", profiles = "customer 1"),
@CsvBindByName(column = "given name", profiles = "customer 2")
})
private String name;
@CsvIgnore(profiles = "customer 2")
@CsvBindByName(column = "middle initial")
private char initial;
@CsvBindByName(column = "salary", profiles = "customer 1")
@CsvBindByName(column = "annual salary", profiles = "customer 2")
@CsvNumber(value = "#0.00", profiles = "customer 1")
@CsvNumber(value = "0.0#E0", profiles = "customer 2")
private float salaryInUSD;
@CsvBindByName(column = "height")
@CsvNumbers({
@CsvNumber("000"),
@CsvNumber(value = "000cm", profiles = "customer 2")
})
private int heightInCentimeters
// Accessor methods go here.
}
// Now, the profile can be used in the builder parse, see below.
List<Person> beans = new CsvToBeanBuilder<Person>(inputfile)
.withProfile("customer 1")
.withType(Person.class)
.build()
.parse();