Как создать файл CSV в Java из списка, где список имеет составной класс - PullRequest
0 голосов
/ 20 ноября 2018

У меня следующий 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 работает для некомпонентного класса.Я мог сделать что-то не так.Так что пример кода будет полезен.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

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

0 голосов
/ 20 ноября 2018

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());
    });
...