Validieren Sie jedes Feld in einem Durchgang mit SuperCSV

Ich versuche, mit SuperCSV eine große Anzahl von Zeilen (~ 2 Millionen) aus einer Datenbank in eine CSV-Datei zu schreiben. Ich muss eine Validierung für jede Zelle durchführen, wie sie geschrieben ist, und die eingebauten CellProcessors funktionieren sehr gut. Ich möchte alle Ausnahmen erfassen, die von den CellProcessors ausgelöst werden, damit ich zu den Quelldaten zurückkehren und Änderungen vornehmen kann.

Das Problem ist, dass bei mehreren Fehlern in einer einzelnen Zeile (z. B. Der erste Wert liegt außerhalb des gültigen Bereichs, der zweite Wert ist null, sollte es aber nicht sein) nur der erste CellProcessor ausgeführt wird und daher nur einer angezeigt wird der Fehler. Ich möchte die gesamte Datei in einem Durchgang verarbeiten und am Ende eine vollständige Reihe von Ausnahmen haben.

Dies ist die Art von Ansatz, den ich versuche:

for (Row row : rows) {
    try {
        csvBeanWriter.write(row, HEADER_MAPPINGS, CELL_PROCESSORS);
    } catch (SuperCsvCellProcessorException e) {
        log(e);
    }
}

Wie kann ich das erreichen? Vielen Dank!

EDIT: Hier ist der Code, den ich geschrieben habe und der dem von Hound Dog ähnelt, falls er jemandem hilft:

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);
    }
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage