Как сгенерировать CSV-файл на Java из списка, где у List есть составной класс

У меня есть следующий класс Java и список как: -

   class Person{
        String name;
        int age;
        Address address;

    }

    class Address{
        String street;
        String post_code;
        String city;
        String country;
    }

    List<Person> personList = new ArrayList<>();

Я хочу сгенерировать CSV-файл из списка. Я мог бы легко это сделать, если бы не было харизма сложных классов. Не могли бы вы подсказать, как мне это сделать? Я попробовал opencsv и подал заявку. Opencsv работает для несоставного класса. Я мог сделать что-то не так. Так что пример кода будет полезен.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
3 063
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

CSV = "Значения, разделенные запятыми". Вы можете сами создать CSV-файл. Вы можете записать в файл значения, разделенные запятой (или точкой с запятой). эти значения являются ячейками одной строки. строка заканчивается, когда вы пишете разделитель строк.

hier - это простой и базовый пример того, как писать строки в формате csv:

public static final char CSV_SEPARATOR = ';'; // it could be a comma or a semi colon

try (BufferedWriter writer = new BufferedWriter(new FileWriter("my_file.csv"))) {
    personList.forEach(person -> {
        writer.append(person.getName()).append(CSV_SEPARATOR)
              .append(person.getAge()).append(CSV_SEPARATOR)
              .append(persone.getAddress().getStreet()).append(CSV_SEPARATOR)
              .append(persone.getAddress().getpostCode()).append(CSV_SEPARATOR)
              .append(persone.getAddress().getCity()).append(CSV_SEPARATOR)
              .append(persone.getAddress().getCountry()).append(System.lineSeparator());
    });
} catch (IOException ex) {
    ex.printStackTrace();
}

но для вашего случая я бы определил интерфейс CsvPrintable

public interface CsvPrintable {
   String printCsv();
}

затем классы Person и Address реализуют этот интерфейс

class Person implements CsvPrintable {

String name;
int age;
Address address;

@Override
printCsv() {
   return StringBuilder().append(name).append(CSV_SEPARATOR)
                         .append(age).append(CSV_SEPARATOR)
                         .append(address.printCsv()).toString();
   }
}

Вы должны сделать то же самое с Address.

тогда мы можем улучшить первый блок кода:

personList.forEach(person -> {
        writer.append(person.printCsv()).append((System.lineSeparator());
    });

На самом деле, я опубликовал простой код, чтобы получить представление. Фактический объект намного сложнее, чем данный код. Мне нужны файлы json и csv. Я легко могу сгенерировать json с помощью Jackson api. Я обнаружил, что у Джексона также есть csv здесь github.com/FasterXML/jackson-dataformats-text/tree/master/cs‌ v. Но это может работать для POJO. Не знаю, подойдет ли это для сложного объекта?

masiboo 20.11.2018 15:04

Определите новый класс, например PersonWithAddress, который включает все поля из Person и Address. Преобразуйте свой список людей в список лиц с адресом. Теперь вы можете дать openCSV то, что он хочет.

На самом деле, я опубликовал простой код, чтобы получить представление. Фактический объект намного сложнее, чем данный код. Мне нужны файлы json и csv. Я легко могу сгенерировать json с помощью Jackson api. Я обнаружил, что у Джексона также есть csv здесь github.com/FasterXML/jackson-dataformats-text/tree/master/cs‌ v. Но это может работать для POJO. Не знаю, подойдет ли это для сложного объекта?

masiboo 20.11.2018 15:05

Другие вопросы по теме