我无法将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));
}
答案 0 :(得分:0)
这里好几件事。
首先,不相关但引起我注意的是,您不需要使用HeaderColumnNameTranslateMappingStrategy,因为您在对象中执行了@BindByName。要么摆脱setMap,要么尝试HeaderColumnNameMappingStrategy。
现在问题出现了,首先应该使用IterableCSVToBean而不是CSVToBean,因为它允许你一次处理一个。这就是说我相信你已经构建了自己的opencsv版本,因为opencsv是用Java 7构建的,因此不支持.foreach方法。尝试使用旧式迭代器来确保所有内容都按顺序处理并立即处理,因为您的实现要么完全绕过解析,要么是线程化并且尝试在第一个bean之前处理第二个bean(第一个bean处理的是读取和设置标题信息)。