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




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());
});
Определите новый класс, например PersonWithAddress, который включает все поля из Person и Address. Преобразуйте свой список людей в список лиц с адресом. Теперь вы можете дать openCSV то, что он хочет.
На самом деле, я опубликовал простой код, чтобы получить представление. Фактический объект намного сложнее, чем данный код. Мне нужны файлы json и csv. Я легко могу сгенерировать json с помощью Jackson api. Я обнаружил, что у Джексона также есть csv здесь github.com/FasterXML/jackson-dataformats-text/tree/master/cs v. Но это может работать для POJO. Не знаю, подойдет ли это для сложного объекта?
На самом деле, я опубликовал простой код, чтобы получить представление. Фактический объект намного сложнее, чем данный код. Мне нужны файлы json и csv. Я легко могу сгенерировать json с помощью Jackson api. Я обнаружил, что у Джексона также есть csv здесь github.com/FasterXML/jackson-dataformats-text/tree/master/cs v. Но это может работать для POJO. Не знаю, подойдет ли это для сложного объекта?