Я пытаюсь написать большое количество строк (~ 2 миллиона) из базы данных в CSV файл, используя SuperCSV. Мне нужно выполнить проверку на каждую ячейку, поскольку она написана, а встроенные CellProcessors - очень хорошо. Я хочу захватить все исключения, которые бросают CellProcessors, чтобы я мог вернуться к исходным данным и внести изменения.
Проблема заключается в том, что при наличии нескольких ошибок в одной строке (например, первое значение выходит за пределы диапазона, второе значение равно null, но не должно быть), будет выполняться только первый CellProcessor, и поэтому я буду только увидеть одну из ошибок. Я хочу обрабатывать весь файл за один проход и иметь полный набор исключений в конце его.
Вот такой подход, который я пытаюсь сделать:
for (Row row : rows) {
try {
csvBeanWriter.write(row, HEADER_MAPPINGS, CELL_PROCESSORS);
} catch (SuperCsvCellProcessorException e) {
log(e);
}
}
Как я могу это достичь? Спасибо!
EDIT: Вот код, который я написал, похожий на 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<Exception> exceptions;
private final CellProcessor current;
public ExceptionCapturingCellProcessor(CellProcessor current, CellProcessor next, List<Exception> 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);
}
}