2016-02-18 32 views
3

是否可以使用BeanListProcessor計算CSV文件中的列數?我的目標是驗證標題的數量是否等於CSV文件中的值的數量。解析CSV:使用帶有Bean處理器的Univocity對列數進行計數

我曾嘗試這種解決方案:what is the fastest way to get dimensions of a csv file in java

但這僅適用於RowProcessor,和我使用的BeanListProcessor;

BeanListProcessor<SomeObject> rowProcessor = new BeanListProcessor<SomeObject>(SomeObject.class); 

我試着在BeanProcess中覆蓋RowProcessor的方法,但它被聲明爲final。

是否有任何其他方式驗證CSV文件與univocity?

回答

1

您可以隨時換行處理器來實現任何自定義邏輯來管理輸入應如何處理:

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

所有你現在要做的就是用你的自定義實現:

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(); 
+0

謝謝Jeronimo!得到它的工作。令人敬畏的圖書館btw。 –

相關問題