OpenCSV-将多个CSV列映射到单个bean属性

问题描述 投票:2回答:1

我有要求,

  1. 将两个CSV列合并为一个bean属性。
  2. 对列值执行简单的数学运算并映射到bean属性。

想知道是否可以使用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

}

我设法做到这一点的唯一方法是将列映射为单独的属性(userIdfirstNamelastNameworkedMinutes),然后修改employeeNameworkedHours getter方法,但我觉得应该有更好的方法来做到这一点。

java csv opencsv
1个回答
0
投票

我不知道如何使用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());
© www.soinside.com 2019 - 2024. All rights reserved.