如何使用Java中的CsvMapper动态地将标头分配给csv文件
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何使用Java中的CsvMapper动态地将标头分配给csv文件,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2765字,纯文字阅读大概需要4分钟。
内容图文
![如何使用Java中的CsvMapper动态地将标头分配给csv文件](/upload/InfoBanner/zyjiaocheng/820/b965f111fe8b442987174d9fb48b22b3.jpg)
有人可以帮忙吗?
我被困在阅读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”andPersonDetailsCSVTemplate.age =“Wiliam”
通过使用@JsonPropertyOrder(value = {“personNameHeader”,“personAgeHeader”})注释类,强制CSV始终为name列,后跟age列,这不是理想的.
任何人都可以提出他们认为有效的建议吗?
问候
解决方法:
您可以使用sortedBy并为其提供csv数据中属性的顺序:
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonPropertyOrder(value = { "personNameHeader", "personAgeHeader" })
static class PersonDetailsCSVTemplate
{
@JsonProperty("personNameHeader")
private String name;
@JsonProperty("personAgeHeader")
private String age;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getAge()
{
return age;
}
public void setAge(String age)
{
this.age = age;
}
@Override
public String toString()
{
return "PersonDetailsCSVTemplate [name=" + name + ", age=" + age + "]";
}
}
你可以保留或离开@JsonPropertyOrder,它不会影响输出.
@Test
public void sort() throws IOException
{
CsvMapper csvMapper = new CsvMapper();
CsvSchema schema = csvMapper
.typedSchemaFor(PersonDetailsCSVTemplate.class)
.withHeader()
.sortedBy("personNameHeader", "personAgeHeader")
.withColumnSeparator(',')
.withComments();
MappingIterator<PersonDetailsCSVTemplate> dataIterator =
csvMapper
.readerFor(PersonDetailsCSVTemplate.class)
.with(schema)
.readValues("personNameHeader,personAgeHeader\r\n"
+
"Wiliam,32\r\n");
while (dataIterator.hasNextValue())
{
PersonDetailsCSVTemplate dataCSV = dataIterator.nextValue();
System.out.println(dataCSV);
}
}
输出:
PersonDetailsCSVTemplate [name=Wiliam, age=32]
内容总结
以上是互联网集市为您收集整理的如何使用Java中的CsvMapper动态地将标头分配给csv文件全部内容,希望文章能够帮你解决如何使用Java中的CsvMapper动态地将标头分配给csv文件所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。