Java 如何使用opencsv读取无头csv文件?

Java 如何使用opencsv读取无头csv文件?,java,csv,parsing,opencsv,Java,Csv,Parsing,Opencsv,我确实知道头,但是头是单独解析的。我正在使用带有注释的pojo并将其设置为类型 我的代码如下所示: CsvToBean<MyObject> bb = new CsvToBeanBuilder<MyObject>(reader) .withSeparator(SEPERATOR) .withIgnoreLeadingWhiteSpace(true) .withType(MyOb

我确实知道头,但是头是单独解析的。我正在使用带有注释的pojo并将其设置为类型

我的代码如下所示:

 CsvToBean<MyObject> bb = new CsvToBeanBuilder<MyObject>(reader)
                .withSeparator(SEPERATOR)
                .withIgnoreLeadingWhiteSpace(true)
                .withType(MyObject.class)
                .build();
CsvToBean bb=新的CsvToBeanBuilder(读卡器)
.带分离器(分离器)
.带忽略前导空格(true)
.withType(MyObject.class)
.build();
当我迭代时,我得到了所有空值的MyObject。MyObject是pojo,其字段用列名注释


有没有办法在opencsv中设置标题?

CsvToBean
上有一个
MappingStrategy
ColumnPositionMappingStrategy
将允许您按名称将列链接到bean属性

例如:

    CsvToBean<MyObject> bb = new CsvToBeanBuilder<MyObject>(reader)
            .withSeparator(SEPERATOR)
            .withIgnoreLeadingWhiteSpace(true)
            .withType(MyObject.class)
            .build();

    ColumnPositionMappingStrategy<MyObject> mappingStrategy = new ColumnPositionMappingStrategy<>();
    mappingStrategy.setType(MyObject.class);
    mappingStrategy.setColumnMapping("property1", "property2");
    bb.setMappingStrategy(mappingStrategy);

    bb.parse();
CsvToBean bb=新的CsvToBeanBuilder(读卡器)
.带分离器(分离器)
.带忽略前导空格(true)
.withType(MyObject.class)
.build();
ColumnPositionMappingStrategy mappingStrategy=新ColumnPositionMappingStrategy();
mappingStrategy.setType(MyObject.class);
setColumnMapping(“property1”、“property2”);
bb.设置映射策略(映射策略);
bb.parse();

正如我在上一篇评论中提到的,我最终实现了一个自定义策略来解决我的问题

public class BlahMappingStrategy extends HeaderColumnNameMappingStrategy {
List<String> headerList;

public BlahMappingStrategy(List<String> headerList) {
    this.headerList = headerList;
}

@Override
public void captureHeader(CSVReader reader) throws IOException, CsvRequiredFieldEmptyException {
    if (this.type == null) {
        throw new IllegalStateException(ResourceBundle.getBundle("opencsv", this.errorLocale).getString("type.unset"));
    } else {
        String [] header = headerList.toArray(new String[headerList.size()]);
        this.headerIndex.initializeHeaderIndex(header);
    }
}
公共类BlahMappingStrategy扩展了HeaderColumnNameMapping策略{
列表标题列表;
公共BlahMappingStrategy(列表标题列表){
this.headerList=headerList;
}
@凌驾
public void captureHeader(CSVReader reader)抛出IOException,CsvRequiredFieldEmptyException{
if(this.type==null){
抛出新的IllegalStateException(ResourceBundle.getBundle(“opencsv”,this.errorLocale.getString(“type.unset”);
}否则{
String[]header=headerList.toArray(新字符串[headerList.size()]);
this.headerIndex.initializeHeaderIndex(header);
}
}
}


这就是所需要的。

谢谢,但那不行。由于其他要求,我不能使用列位置。我必须使用列名。当我使用其他映射策略时,通过读取第一行自动拾取标题。因为我在第一行没有标题,所以映射将不起作用。似乎我必须通过扩展现有的srategies或实现接口来编写一个自定义映射策略。现有的战略都不行。