java - 如何将复杂的 Java 对象写入 CSV 文件

标签 java file csv nested opencsv

所以,我知道如何将简单的 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 对象)效果很好,所以我不完全确定我做错了什么。有谁对此事有任何经验或知道我可能需要在这里纠正什么?

最佳答案

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 许可证)

关于java - 如何将复杂的 Java 对象写入 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56226865/

相关文章:

java - Android、Java 和 2d 绘图

java - 使用 SQL Server 方言将 Hibernate 配置为转义 LIKE 子句中的下划线

java - 读取和处理多个文本文件

Excel 无法打开大文件

python - Hadoop Reducer 没有结合所有 map 作业

java - 卡片布局错误: wrong parent for card layout

java - 使用 bat 文件命令更改 Java 控制面板设置

android - 通过蓝牙流复制后损坏的音频文件

r - 如何从 Rnw Sweave 文件中提取所有代码块?

python - 如何将列表中的数据存储在 .csv 文件中?