При разборе SuperCsv/beanreader встречается исключение в первой строке и возвращается NULL

Я пытаюсь проанализировать CSV-файл с помощью Supercsv. Я использую некоторое "исключение перехвата", чтобы устранить строку с неправильной структурой или данными.

Все строки обрабатываются с помощью цикла 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. Но, безусловно, есть лучший способ...

Не могли бы вы помочь мне?

1 ответ

Решение

Проблема вызвана тем, что ucdr (контейнер для проанализированной строки) может быть нулевым либо в конце файла, либо из-за плохой строки в вашем файле. Поскольку ваш код обрабатывает все исключения, вызванные плохой строкой, нет способа узнать, является ли ucdr нулевым, потому что достигнут конец файла или была обнаружена плохая строка. Я предлагаю использовать другое условие для цикла, которое будет ложным, только если ucdr имеет значение null, поскольку достигнут конец файла, например:

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 вне цикла выглядит немного подозрительно...

Другие вопросы по тегам