我尝试使用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。但肯定有更好的方法......
你能帮帮我吗?
答案 0 :(得分:4)
问题是由于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看起来有点可疑......