Univocity — запись свойства списка в несколько строк

У меня есть bean-компонент Person, у которого есть List "memberOf". Теперь я хочу написать одну строку этого bean-компонента для каждой записи «memberOf» (это требуется для проекта). Весь мой код написан вокруг bean-компонентов, но у меня есть эта проблема. Например:

public class Person {
    @Parsed(field = "USR_USERID")
    private String uid;
    @Parsed(field = "USR_NSUNIQUEID")
    private String nsUniqueID;

    @Parsed(field = "GROUP_NAME")
    List<String>isMemberOf;
    //-- Getters and Setters...
}

Используя CsvWriterSettings и BeanWriterProcessor, я получаю в csv что-то вроде:

"uid","nsuniqueId","[memberOf1, memberOf2...]"

Но то, что я хотел бы, это:

"uid","nsuniqueId","memberOf1"
"uid","nsuniqueId","memberOf2"

Есть ли способ сделать это при использовании BeanWriterProcessor?

Спасибо


person snap98    schedule 08.10.2017    source источник


Ответы (1)


Автор библиотеки здесь. Хотя библиотека не поддерживает то, что вы хотите сделать, заставить ее работать относительно легко - следующий пример немного дерьмовый, но сделает то, что вы хотите.

По сути, вы можете аннотировать методы вашего класса. Используйте это, чтобы создать метод, который возвращает элемент вашего isMemberOf каждый раз, когда он вызывается. Например:

    private int groupNameIndex = 0;

    @Parsed(field = "GROUP_NAME")
    public String nextGroupName() {
        if (hasMoreGroups()) {
            return isMemberOf.get(groupNameIndex++);
        }
        return null;
    }

    public boolean hasMoreGroups() {
        return isMemberOf != null && groupNameIndex < isMemberOf.size();
    }

Затем вы можете писать один и тот же компонент снова и снова, пока hasMoreGroups не вернет false:

    while (person.hasMoreGroups()) {
        writer.processRecord(person);
    }

Код, который я использовал для тестирования:

public static void main(String... args) {
    Person person = new Person();
    person.uid = "XYZ";
    person.nsUniqueID = "abc";
    person.isMemberOf.add("group1");
    person.isMemberOf.add("group2");
    person.isMemberOf.add("group3");

    StringWriter out = new StringWriter();

    CsvWriterSettings settings = new CsvWriterSettings();
    settings.setHeaderWritingEnabled(true);
    settings.setRowWriterProcessor(new BeanWriterProcessor<Person>(Person.class));

    CsvWriter writer = new CsvWriter(out, settings);

    while (person.hasMoreGroups()) {
        writer.processRecord(person);
    }
    writer.close();

    System.out.println(out.toString());
}

Выход:

USR_USERID,USR_NSUNIQUEID,GROUP_NAME
XYZ,abc,group1
XYZ,abc,group2
XYZ,abc,group3

Надеюсь, поможет

person Jeronimo Backes    schedule 09.10.2017
comment
Мне нравится обходной путь. Я не думал об аннотации для каждого метода. Большое спасибо - person snap98; 09.10.2017