java - 如何将复杂的 Java 对象写入 CSV 文件
问题描述
所以,我知道如何将一个简单的 Java 对象写入 CSV 文件,但是我在处理具有更复杂属性的 Java 对象时遇到了麻烦。以下是我目前拥有的示例:
人.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 ...
}
地址信息.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 对象)工作得很好,所以我不完全确定我做错了什么。有没有人对此事有任何经验或知道我可能需要在这里纠正什么?
解决方案
这在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 许可证)
推荐阅读
- mysql - SQL查询同一张表的不同、内部或连接2列并显示所有字段
- angular - 模态窗口关闭功能不起作用
- sql-server - Docker SQL Server 2017 上的 Linux 连接问题
- javascript - React:SlickGrid 需要一个有效的容器,#myGrid 在 DOM 中不存在
- asp.net-core - 将表外键标题绑定到asp.net核心中的下拉列表中
- ionic-framework - ionic 4将数据从在另一个模态中打开的模态传回基本页面
- google-cloud-data-fusion - 如何在 CDAP (Datafusion) 中处理具有不同列的 CSV?
- wcf - 使用 WCF 启用 CORS
- ios - 无法在 swift 4 中使用 UIDocumentInteractionController 预览 .xlsx 文件
- jquery - 我可以隐藏网站中使用的 jquery 版本吗?