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 が 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 に設定すると、少し怪しいように見えます...

于 2013-03-05T12:13:32.560 に答える