Opencsv:无法将CsvToBeanFilter与CsvToBeanBuilder和带注释的bean对象一起使用

时间:2018-02-01 17:21:54

标签: opencsv

我无法将CsvToBeanFilter与CsvToBeanBuilder和带注释的bean对象一起使用。它给出了“引起:java.lang.RuntimeException:java.lang.IllegalStateException:标题行尚未被读取。”错误。

这是我的过滤器 -

private class AssetTypeFilter implements CsvToBeanFilter {

    private final MappingStrategy strategy;

    public AssetTypeFilter(MappingStrategy strategy) {
        this.strategy = strategy;
    }

    @Override
    public boolean allowLine(String[] line) {
        final int index = this.strategy.getColumnIndex("MF056");
        final String value = line[index];
        final boolean result = "CRDT".equals(value);
        return result;
    }

}

这是我的豆 -

@ToString
@Data
public class DsbISINCsv {

    @CsvBindByName(column = "ID", required = false)
    private String sourceId;

    @CsvBindByName(column = "MF056", required = false)
    private String assetClass;

    @CsvBindByName(column = "MF057", required = false)
    private String instrumentType;

    @CsvBindByName(column = "MF086", required = false)
    private String derivativeISIN;

    @CsvBindByName(column = "MF091", required = false)
    private String classificationType;
}

以下是读取CSV的代码 -

public void process(File msg) {
    final List<MyBean> data = new ArrayList<>();
        final HeaderColumnNameTranslateMappingStrategy<
            MyBean> strategy = new HeaderColumnNameTranslateMappingStrategy();
        final Map<String, String> columnMap = new HashMap();
        columnMap.put("MF056", "assetClass");
        strategy.setColumnMapping(columnMap);
        strategy.setType(MyBean.class);

        // Parse one row at a time
        final CsvToBean<MyBean> reader = new CsvToBeanBuilder(getReader(msg)).withType(MyBean.class)
            .withOrderedResults(false)
            .withFilter(new AssetTypeFilter(strategy))
            .build();

        reader.forEach(a -> processData(a));
}

1 个答案:

答案 0 :(得分:0)

这里好几件事。

首先,不相关但引起我注意的是,您不需要使用HeaderColumnNameTranslateMappingStrategy,因为您在对象中执行了@BindByName。要么摆脱setMap,要么尝试HeaderColumnNameMappingStrategy。

现在问题出现了,首先应该使用IterableCSVToBean而不是CSVToBean,因为它允许你一次处理一个。这就是说我相信你已经构建了自己的opencsv版本,因为opencsv是用Java 7构建的,因此不支持.foreach方法。尝试使用旧式迭代器来确保所有内容都按顺序处理并立即处理,因为您的实现要么完全绕过解析,要么是线程化并且尝试在第一个bean之前处理第二个bean(第一个bean处理的是读取和设置标题信息)。