Как разделить столбец CSV, разделенный разделителем, используя пользовательский разделитель? - PullRequest
0 голосов
/ 18 мая 2019

У меня есть контроллер rest, у которого есть пост-отображение, которое должно принимать csv / text в качестве входных данных.Ниже приведен формат csv: -

id, name, phoneNumber
n1,Joe/Dowwel,123-212-3233
n2,Sara/Ali,132,232,3111

Я использую аннотацию open csv, как показано ниже, для преобразования csv в java pojo в качестве входных данных для метода контроллера post mapping.:-

@CsvBindByPosition(position=2)
private String name;

Эта аннотация отобразит поле ввода csv 'name' в поле java объекта (POJO) 'name' (как показано ниже)

public class Employee {


    @CsvBindByPosition(position=1)
    private String id;

    @CsvBindByPosition(position=2)
    private String name;

    @CsvBindByPosition(position=3)
    private String phoneNumber;

    public Employee () {
    }  

Однако значение 'name' вjava pojo после того, как конвертер пружины преобразует его, будет ex: Joe / Dowwel (с разделителем '/')

Мне необходимо иметь 2 отдельных поля 'firstName' и 'lastName' в POJO для сотрудников, напримерчто я могу разделить и отделить его как «firstName» = Джо и «фамилия» = Dowwel.

Есть ли способ, которым я могу добиться этого, используя более чистый подход.Может быть, использовать еще несколько аннотаций для фильтрации?

Любая помощь будет оценена.Заранее спасибо.

1 Ответ

0 голосов
/ 04 июля 2019

Очевидно, что ваши входные данные не отображаются на структуру вашего класса. Квадратный колышек, круглое отверстие. Здесь нет волшебного решения.

Вы должны либо:

  • Исправьте источник данных, попросив издателя данных разделить одно поле name на пару полей given_name & surname.
  • Анализирует данные на вашем конце, разделяя одно значение на пару значений.

Первый вариант идеален. Вместо того, чтобы взламывать данные после факта, прежде всего, предоставьте данные должным образом.

Если это невозможно, вы должны найти обходной путь.

Первый обходной путь, который мне приходит в голову, заключается в том, что у вас есть конструктор класса Employee, который принимает входящее комбинированное имя и разбивает его на два других поля. Смотри String::split.

Однако использование этого обходного пути с вашим текущим кодом означает определение избыточного name поля участника в вашем Employee в дополнение к вашим полям имени и фамилии. Таким образом, другой обходной путь - не использовать функцию привязки вашей библиотеки CSV. Вместо этого напишите немного кода, который читает каждое поле CSV и передает его конструктору Employee. При обнаружении поля name разделите его, а затем передайте обе части вашему конструктору.

...