OpenCSV - сопоставление нескольких столбцов CSV с одним атрибутом компонента - PullRequest
2 голосов
/ 16 января 2020

У меня есть требование:

  1. объединить два столбца CSV в один атрибут компонента.
  2. Выполните простую математическую операцию со значением столбца и сопоставьте его с атрибутом бина.

Интересно, возможно ли что-то подобное, используя аннотации 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, но я чувствую, что должен быть лучший способ сделать это.

1 Ответ

1 голос
/ 20 января 2020

Я не знаю, как это сделать с 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());
...