gpt4 book ai didi

java - OpenCsv 用 BeanToCsv + HeaderColumnNameTranslateMappingStrategy 写错列名

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

我正在使用 opencsv 3.6 从 java bean 开始创建一个 csv 文件。

首先,我试过这段代码:

import com.opencsv.CSVReader;
import com.opencsv.CSVWriter;
import com.opencsv.bean.BeanToCsv;
import com.opencsv.bean.HeaderColumnNameTranslateMappingStrategy;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class CustomBean {

private String name;
private String surname;

public CustomBean(String n, String s) {
this.name = n;
this.surname = s;
}

public void setName(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void setSurname(String surname) {
this.surname = surname;
}

public String getSurname() {
return surname;
}

public static void main(String[] args) {
Map<String,String> mapping = new HashMap<String,String>();
mapping.put("COLUMN1","name");
mapping.put("COLUMN2","surname");

HeaderColumnNameTranslateMappingStrategy<CustomBean> strategy = new HeaderColumnNameTranslateMappingStrategy<CustomBean>();
strategy.setType(CustomBean.class);
strategy.setColumnMapping(mapping);

ArrayList<CustomBean> customUsers = new ArrayList<CustomBean>();
customUsers.add(new CustomBean("Kobe","Bryant"));

BeanToCsv<CustomBean> bean = new BeanToCsv<CustomBean>();

try {
CSVWriter writer = new CSVWriter(new FileWriter("testOut.csv"));
bean.write(strategy, writer, customUsers);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}

}
}

但我有以下错误:

Exception in thread "main" java.lang.RuntimeException: Error writing CSV !
at com.opencsv.bean.BeanToCsv.write(BeanToCsv.java:74)
at test.CustomBean.main(CustomBean.java:63)
Caused by: java.lang.NullPointerException
at com.opencsv.bean.HeaderColumnNameTranslateMappingStrategy.getColumnName(HeaderColumnNameTranslateMappingStrategy.java:45)
at com.opencsv.bean.HeaderColumnNameMappingStrategy.findDescriptor(HeaderColumnNameMappingStrategy.java:112)
at com.opencsv.bean.BeanToCsv.processHeader(BeanToCsv.java:103)
at com.opencsv.bean.BeanToCsv.write(BeanToCsv.java:69)
... 1 more

发生这种情况是因为在 HeaderColumnNameTranslateMappingStrategy 类的 getColumnName 方法中的 opencsv 源代码中有以下行:

return col < header.length ? columnMapping.get(header[col].toUpperCase()) : null;

因此,header 为空。这是真的,实际上这个类是 HeaderColumnNameMappingStrategy 类的子类,它包含从未初始化的 header 变量(String[] 类型) .

我在这个类中找到的唯一有用的方法是 captureHeader,但不幸的是它需要一个 CSVReader 作为输入。

因此我创建了一个空的 csv 文件:

COLUMN1,COLUMN2

我在 try/catch block 的开头添加了以下行:

CSVReader reader = new CSVReader(new FileReader("testIn.csv"));
strategy.captureHeader(reader);

以这种方式(我真的不喜欢,因为我必须创建一个 csv 文件)我也不异常(exception),但在结果 csv 文件中,列的名称不遵循映射策略:

"name","surname"
"Kobe","Bryant"

两个问题:

  1. 如何获得预期的结果,即 csv 文件中的正确列名?
  2. 有没有办法不使用 CSVReader 类?

最佳答案

查看BeanToCsv的源代码, processHeader(...)方法对提供的 header 不执行任何操作。您唯一的选择是创建自定义策略(以避免 CSVReader )和自定义 BeanToCsv如下

 

public class CustomBean {
...
public static void main(String[] args) {
...
HeaderColumnNameTranslateMappingStrategy strategy = new <b>CustomStrategy</b><CustomBean>();
strategy.setType(CustomBean.class);
strategy.setColumnMapping(mapping);
...

BeanToCsv bean = new <b>CustomBeanToCsv</b><CustomBean>();
...
}

static class CustomStrategy<T> extends HeaderColumnNameTranslateMappingStrategy {

@Override
public void setColumnMapping(Map columnMapping) {
super.setColumnMapping(columnMapping);
header = new String[columnMapping.size()];
int i = 0;
for (Map.Entry entry : columnMapping.entrySet()) {
header[i] = entry.getKey().toUpperCase();
i++;
}
}

public String[] getHeader() {
return header;
}
}

static class CustomBeanToCsv<T> extends BeanToCsv {
@Override
protected String[] processHeader(MappingStrategy mapper) throws IntrospectionException {
if (mapper instanceof CustomStrategy) {
return ((CustomStrategy) mapper).getHeader();
} else {
return super.processHeader(mapper);
}
}
}
}

关于java - OpenCsv 用 BeanToCsv + HeaderColumnNameTranslateMappingStrategy 写错列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33778223/

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