gpt4 book ai didi

java - 如何使用 Java 中的 CsvMapper 将 header 动态分配给 csv 文件

转载 作者:搜寻专家 更新时间:2023-10-31 19:36:56 25 4
gpt4 key购买 nike

有人可以帮忙吗?我坚持读取 csv 文件并将其序列化到 POJO 上。我正在使用 jackson 库中的 CsvMapper。阅读和序列化部分已完成并且工作正常。问题是当用户移动标题/列时导致序列化做出一些字母顺序假设,即 CSV 文件上的值也是按字母顺序排列的。
例如(下面的文件在第一行有标题,第二行有人员详细信息值)
personNameHeader,personAgeHeader
威廉,32岁

现在我的POJO如下

@JsonIgnoreProperties(ignoreUnknown = true)
// @JsonPropertyOrder(value = {"personNameHeader", "personAgeHeader" })
public class PersonDetailsCSVTemplate {

@JsonProperty("personNameHeader")
private String name;

@JsonProperty("personAgeHeader")
private String age;

//Public constructor and getters and setters...

这是从 CSV 中读取值并映射到类的代码

import com.fasterxml.jackson.databind.MappingIterator;
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;
...

CsvMapper csvMapper = new CsvMapper();
CsvSchema schema = csvMapper.typedSchemaFor(PersonDetailsCSVTemplate.class).withHeader();
MappingIterator<PersonDetailsCSVTemplate > dataIterator = csvMapper.readerFor(PersonDetailsCSVTemplate.class).with(schema)
.readValues(data);

while (dataIterator.hasNextValue()) {
PersonDetailsCSVTemplate dataCSV = dataIterator.nextValue();
}

在序列化之后,可以看到 CsvMapper 映射了以下内容:PersonDetailsCSVTemplate.name = "32"PersonDetailsCSVTemplate.age = "Wiliam"

通过使用 @JsonPropertyOrder(value = {"personNameHeader", "personAgeHeader"}) 注释类强制 CSV 始终是名称列后跟年龄列,这并不理想。

任何人都可以提出他们认为可行的任何建议吗?问候

最佳答案

从 Jackson 2.7 开始,您可以使用 withColumnReordering(true) 而不是 sortedBy()

CsvSchema schema = csvMapper
.typedSchemaFor(PersonDetailsCSVTemplate.class)
.withHeader()
.withColumnReordering(true);

关于java - 如何使用 Java 中的 CsvMapper 将 header 动态分配给 csv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44785689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com