Проверяйте каждое поле за один проход с помощью SuperCSV
я пытаюсь записать большое количество строк (~ 2 миллиона) из базы данных в файл CSV, используя SuperCSV. Мне нужно выполнить проверку каждой ячейки, как она написана, и встроенные CellProcessors работают очень хорошо. Я хочу захватить все исключения, которые вызываются CellProcessors, чтобы я мог вернуться к исходным данным и внести изменения.
Проблема заключается в том, что когда в одной строке несколько ошибок (например, первое значение выходит за пределы диапазона, второе значение равно нулю, но не должноt), будет выполняться только первый CellProcessor, и поэтому яЯ увижу только одну из ошибок. Я хочу обработать весь файл за один проход и получить полный набор исключений в конце.
Это такой подход, который яя пытаюсь:
for (Row row : rows) {
try {
csvBeanWriter.write(row, HEADER_MAPPINGS, CELL_PROCESSORS);
} catch (SuperCsvCellProcessorException e) {
log(e);
}
}
Как мне этого добиться? Спасибо!
РЕДАКТИРОВАТЬ: Вот код, который я написал, чтопохож на Hound Dog 's, на случай, если это кому-нибудь поможет:
import java.util.List;
import org.supercsv.cellprocessor.CellProcessorAdaptor;
import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.exception.SuperCsvCellProcessorException;
import org.supercsv.util.CsvContext;
public class ExceptionCapturingCellProcessor extends CellProcessorAdaptor {
private final List exceptions;
private final CellProcessor current;
public ExceptionCapturingCellProcessor(CellProcessor current, CellProcessor next, List exceptions) {
super(next);
this.exceptions = exceptions;
this.current = current;
}
@Override
public Object execute(Object value, CsvContext context) {
// Check input is not null
try {
validateInputNotNull(value, context);
} catch (SuperCsvCellProcessorException e) {
exceptions.add(e);
}
// Execute wrapped CellProcessor
try {
current.execute(value, context);
} catch (SuperCsvCellProcessorException e) {
exceptions.add(e);
}
return next.execute(value, context);
}
}