2

我尝试使用 Supercsv 解析 csv 文件。我使用一些“捕获异常”来消除结构或数据错误的行。

所有行都通过 do / while 循环处理。但是如果第一行导致异常(正则表达式...),则 read() 方法的返回值为 null,这会导致 while 循环停止。

我怎样才能通过保持坏线的消除来避免这种情况?

这是代码:

CsvPreference LSP_PREFERENCE = new CsvPreference.Builder(' ', ';', "\n").build();
beanReader = new CsvBeanReader(new InputStreamReader(new FileInputStream(fileToTreat), "ISO-8859-1"), LSP_PREFERENCE);
            CsvPreference LSP_PREFERENCE = new CsvPreference.Builder(' ', ';', "\n").build();
            beanReader = new CsvBeanReader(new InputStreamReader(new FileInputStream(fileToTreat), "ISO-8859-1"), LSP_PREFERENCE);
treatedOk = true;


ucdr = null;

do {
    try {
         ucdr = beanReader.read(ConvergeDataRow.class, headers, processors);
         if (ucdr != null) {
           rdata.add(ucdr);   // contains list of row data.
         }
     } catch (SuperCsvConstraintViolationException ex) {
          logger.log(Level.SEVERE, "NON CORRECT VALUE ENCOUNTERD ON ROW "+beanReader.getRowNumber(), ex);
          treatedOk = false;

     } catch (SuperCsvCellProcessorException ex){
         logger.log(Level.SEVERE, "PARSER EXCEPTION ON ROW "+beanReader.getRowNumber(), ex);
         treatedOk = false;
     } catch (org.supercsv.exception.SuperCsvException ex){
          logger.log(Level.SEVERE, "ERROR ON ROW "+beanReader.getRowNumber(), ex);
                    treatedOk = false;
     }

} while (ucdr != null);treatedOk = true;

一个厄运的解决方案是强制 ucdr 为 null 的其他值。但肯定有更好的方法...

你可以帮帮我吗?

4

1 回答 1

4

问题是由于 ucdr(已解析行的容器)在文件末尾或文件中的错误行可能为 null 的事实引起的。由于您的代码处理由坏行引起的所有异常,因此无法知道 ucdr 是否为空,因为已到达文件结尾或是否遇到坏行。我建议为循环使用另一种条件,仅当 ucdr 为空时才为假,因为到达了文件的末尾,如下所示:

boolean continueLooping = true;
do {
    try {
         ucdr = beanReader.read(ConvergeDataRow.class, headers, processors);
         if (ucdr != null) {
           rdata.add(ucdr);   // contains list of row data.
         }
         // this line will be skipped when an exception is thrown during 
         // parsing, but not if the line is successfully handled or on end of
         // file .
         continueLooping = ucdr != null;
     } catch (SuperCsvConstraintViolationException ex) {
          logger.log(Level.SEVERE, "NON CORRECT VALUE ENCOUNTERD ON ROW "+beanReader.getRowNumber(), ex);
          treatedOk = false;

     } catch (SuperCsvCellProcessorException ex){
         logger.log(Level.SEVERE, "PARSER EXCEPTION ON ROW "+beanReader.getRowNumber(), ex);
         treatedOk = false;
     } catch (org.supercsv.exception.SuperCsvException ex){
          logger.log(Level.SEVERE, "ERROR ON ROW "+beanReader.getRowNumber(), ex);
                    treatedOk = false;
     }

} while (continueLooping);
treatedOk = true;

注意:treatedOk在循环外设置为 true 看起来有点可疑......

于 2013-03-05T12:13:32.560 回答