Как записать сложный объект Java в файл CSV - PullRequest
1 голос
/ 20 мая 2019

Итак, я знаю, как записать простой объект Java в файл CSV, но у меня возникли проблемы с объектом Java, имеющим более сложные атрибуты.Ниже приведен пример того, что у меня сейчас есть:

Person.java

public class Person {
    @CsvBindByName(column="name")
    private String name;

    @CsvBindByName(column="position")
    private String position;

    private AddressInfo info;

    // getters and setters ...

    // overridden toString method ...
}

AddressInfo.java

public class AddressInfo {
    @CsvBindByName(column="street")
    private String street;

    @CsvBindByName(column="city")
    private String city;

    @CsvBindByName(column="state")
    private String state;

    // getters and setters ...

    // overridden toString method ...
}

PersonWriter.java

public class PersonWriter {
    private static final Logger LOGGER = LoggerFactory.getLogger(PersonWriter.class);

    public static boolean writeCsVFromPerson(String directory, List<Person> persons) {
        File file = new File(directory + "/person-" + System.nanoTime() + ".csv");
        try {
            Writer writer = new FileWriter(file);
            MappingStrategy<Person> ms = new HeaderColumnNameMappingStrategy<Person>();
            ms.setType(Person.class);
            StatefulBeanToCsv<Person> sbc = new StatefulBeanToCsvBuilder<Person>(writer)
                    .withSeparator(CSVWriter.DEFAULT_SEPARATOR)
                    .withMappingStrategy(ms)
                    .build();
            sbc.write(persons);
            writer.close();
        } catch (Exception e) {
            LOGGER.error("Failed to create Person CSV file", e)            
        }
        return file.exists() && file.isFile();
    }
}

Это работает, поскольку создание действительного файла CSV (по большей части), но файл CSV не содержит никаких атрибутов AddressInfo.Обратное (чтение из CSV в Java Object) работает просто отлично, поэтому я не совсем уверен, что я делаю неправильно.Кто-нибудь имеет какой-либо опыт по этому вопросу или знает, что мне нужно исправить здесь?

1 Ответ

1 голос
/ 22 мая 2019

Это поддерживается в univocity-parsers . Просто используйте аннотацию @Nested, и все будет правильно отображено:

public class Person {

    @Parsed
    private String name;

    @Parsed
    private String position;

    @Nested
    private AddressInfo info;

}

Для записи такой структуры в CSV:

List<Person> persons = buildYourPersonList();
File file = new File(directory + "/person-" + System.nanoTime() + ".csv");
new CsvRoutines(settings).writeAll(persons, Person.class, file, "UTF-8");

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

Отказ от ответственности: я являюсь автором этой библиотеки (лицензия Apache 2.0)

...