Valide todos os campos em um único passo com o SuperCSV
Eu estou tentando escrever um grande número de linhas (~ 2 milhões) de um banco de dados para um arquivo CSV usando SuperCSV. Eu preciso executar a validação em cada célula, como está escrito, e os CellProcessors internos fazem muito bem. Eu quero capturar todas as exceções que são lançadas pelos CellProcessors para que eu possa voltar para os dados de origem e fazer alterações.
O problema é que, quando há vários erros em uma única linha (por exemplo, o primeiro valor está fora do intervalo, o segundo valor é nulo, mas não deve ser), somente o primeiro CellProcessor será executado e, portanto, só veremos um dos erros. Eu quero processar o arquivo inteiro em uma única passagem e ter um conjunto completo de exceções no final dele.
Este é o tipo de abordagem que estou tentando:
for (Row row : rows) {
try {
csvBeanWriter.write(row, HEADER_MAPPINGS, CELL_PROCESSORS);
} catch (SuperCsvCellProcessorException e) {
log(e);
}
}
Como posso conseguir isso? Obrigado!
EDIT: Aqui está o código que eu escrevi é semelhante ao do Hound Dog, no caso de ajudar alguém:
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);
}
}