解析CSV:使用Univocity和bean处理器来计算列数

Kev*_*llo 5 java csv

使用BeanListProcessor是否可以计算CSV文件中的列数?我的目标是验证标题的数量等于CSV文件中的值的数量。

我已经尝试过这种解决方案:在Java中获取CSV文件尺寸的最快方法是什么

但这仅适用于RowProcessor,而我正在使用BeanListProcessor。

BeanListProcessor<SomeObject> rowProcessor = new BeanListProcessor<SomeObject>(SomeObject.class);
Run Code Online (Sandbox Code Playgroud)

我尝试在BeanProcess中重写RowProcessor的方法,但是将其声明为final。

还有其他方法可以通过唯一性来验证CSV文件吗?

Jer*_*kes 2

您始终可以包装行处理器来实现任何自定义逻辑来管理如何处理输入:

public class MyRowProcessor<T> implements RowProcessor {

    private final BeanListProcessor<T> wrappedProcessor;

    public MyRowProcessor(Class<T> beanType) {
        wrappedProcessor = new BeanListProcessor<T>(beanType);
    }


    @Override
    public void processStarted(ParsingContext context) {
        wrappedProcessor.processStarted(context);
    }


    @Override
    public void rowProcessed(String[] row, ParsingContext context) {
        //validate the input row here
        if(row.length != context.headers().length){
            return; // Example: I'm skipping the row if the number of columns doesn't match number of headers
        }

        //send the row to the wrapped processor (or skip, or do anything you want)
        wrappedProcessor.rowProcessed(row, context);
    }

    @Override
    public void processEnded(ParsingContext context) {
        wrappedProcessor.processEnded(context);
    }

    public List<T> getBeans() {
        return wrappedProcessor.getBeans();
    }
}
Run Code Online (Sandbox Code Playgroud)

您现在所要做的就是使用您的自定义实现:

MyRowProcessor<SomeObject> processor = new MyRowProcessor<SomeObject>(SomeObject.class);

settings.setRowProcessor(processor);
settings.setHeaderExtractionEnabled(true);

CsvParser parser = new CsvParser(settings);

parser.parse(new File("/path/to/file"));

List<TestBean> beans = processor.getBeans();
Run Code Online (Sandbox Code Playgroud)