我有要求,
想知道是否可以使用OpenCSV注释进行此类操作。
输入CSV
User ID, First Name, Last Name, Worked Minutes
1234,Jon,Snow,60
1235,Rob,Stark,30
Bean
public class Employee {
@CsvBindByName(column = "Employee ID")
private String userId;
//this should be "First Name, Last Name"
private String employeeName;
//this should be Worked Minutes/60
private String workedHours;
//getters and setters
}
我设法做到这一点的唯一方法是将列映射为单独的属性(userId
,firstName
,lastName
,workedMinutes
),然后修改employeeName
和workedHours
getter方法,但我觉得应该有更好的方法来做到这一点。
我不知道如何使用OpenCSV进行此操作,但是我写了一个名为jflat-core的库,它可以处理对象与平面文件之间的这种复杂映射。
CSVReader<Employee> csvReader = CSVReader
.createWithHeaderMapping(Employee.class,
new String[] {"User ID", "First Name", "Last Name", "Worked Minutes"},
new String[] {"userId", "firstName", "lastName", "workedHours" });
//register a special converter for the property workedHours
csvReader.registerConverter("workedHours",
minutes -> String.valueOf(Double.valueOf(minutes)/60.0));
List<Employee> employees = csvReader.readAllWithCallback("employees.csv",
//The callback can be used to help map attributes from the raw record to the target bean
(record, employee) -> {
String name = String.format("%s %s", record.get("First Name"), record.get("Last Name"));
employee.setEmployeeName(name);
});
assertEquals(2, employees.size());
assertEquals("Jon Snow", employees.get(0).getEmployeeName());
assertEquals("0.5", employees.get(1).getWorkedHours());