Java 解析SuperSV/beanreader在第一行遇到异常并返回NULL

Java 解析SuperSV/beanreader在第一行遇到异常并返回NULL,java,supercsv,Java,Supercsv,我尝试使用Supercsv解析csv文件。我使用一些“捕获异常”来消除结构或数据错误的行 所有行都通过do/while循环进行处理。但是,如果第一行导致异常(正则表达式…),read()方法的返回值为null,这将导致while循环停止 如何通过保持坏线路的消除来避免这种情况 代码如下: CsvPreference LSP_PREFERENCE = new CsvPreference.Builder(' ', ';', "\n").build(); beanReader = new CsvBea

我尝试使用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。但肯定有更好的方法


您能帮助我吗?

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

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看起来有点可疑…

问题是由于ucdr(已解析行的容器)在文件末尾可能为null,或者由于文件中的错误行而导致的。由于您的代码处理由错误行引起的所有异常,所以无法知道ucdr是否为null,因为到达了文件结尾,或者是否遇到了错误行。我的建议是为循环使用另一个条件,只有当ucdr为null时,该条件才会为false,因为到达了文件的末尾,如下所示:

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看起来有点可疑…

非常感谢您的帮助!!非常感谢你的帮助!!嗨@FabianH,我们对这个问题有一个开放的看法。我们正在寻找实现它的最佳方式,但我现在会选择fvu的解决方案!嗨@FabianH,我们对这个问题有一个开放的看法。我们正在寻找实现它的最佳方式,但我现在会选择fvu的解决方案!