【问题标题】:How to read csv file without header using opencsv?如何使用opencsv读取没有标题的csv文件?
【发布时间】:2018-10-01 18:38:54
【问题描述】:

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

我的代码如下所示:

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

当我迭代时,我得到了所有空值的 MyObject。 MyObject 是带有用列名注释的字段的 pojo。

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

【问题讨论】:

    标签: java csv parsing opencsv


    【解决方案1】:

    CsvToBean 上有一个 MappingStrategyColumnPositionMappingStrategy 将允许您按名称将列链接到 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();
    

    【讨论】:

    • 谢谢,但这行不通。由于其他要求,我不能使用列位置。我必须使用列名。当我使用其他映射策略时,通过读取第一行会自动选择标题。因为我在第一行没有标题,所以映射不起作用。看来我将不得不通过扩展现有策略或实现接口来编写自定义映射策略。现有的策略都不行。
    【解决方案2】:

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

    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);
        }
    }
    

    }

    这就是我们所需要的。

    【讨论】:

      猜你喜欢
      • 2022-11-12
      • 2013-03-08
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 2015-02-22
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多