CSV Parser Issue - требуется помощь - PullRequest
0 голосов
/ 15 марта 2020

Я сталкиваюсь с такой проблемой, как анализ простого файла CSV. Несколько строк не имеют правильных значений двойных кавычек. Я хотел пропустить эти записи об ошибках (строка) и обработать остальные записи. Записи об ошибках должны храниться отдельно. Я проверил ваш анализатор однозначности, который хорошо работает для записей об успехах (нет проблем с синтаксисом). Но когда я запускаю записи о проблемах, процесс останавливается, а не продолжается.

Text File Entries

date,           amount,     quantity,   pending ,comments
**"10-oct-2001**,   555.999,    1,          yEs     ,?
2001-10-10,     ,           ?,          N       ,"  "" something ""  "

public void parserFile() throws FileNotFoundException {
        long time=System.currentTimeMillis();
        System.out.println(time);
        BeanListProcessor<TestBean> rowProcessor = new BeanListProcessor<TestBean>(TestBean.class);
        CsvParserSettings parserSettings = new CsvParserSettings();

        parserSettings.setKeepEscapeSequences(true);
        parserSettings.setIgnoreLeadingWhitespaces(true);
        parserSettings.setIgnoreTrailingWhitespaces(true);

        parserSettings.setProcessor(rowProcessor);

        parserSettings.setUnescapedQuoteHandling(UnescapedQuoteHandling.STOP_AT_DELIMITER);
        parserSettings.setUnescapedQuoteHandling(UnescapedQuoteHandling.STOP_AT_CLOSING_QUOTE);
        parserSettings.setUnescapedQuoteHandling(UnescapedQuoteHandling.RAISE_ERROR);


        parserSettings.setProcessorErrorHandler(new RowProcessorErrorHandler() {
            @Override
            public void handleError(DataProcessingException error, Object[] inputRow, ParsingContext context) {
                System.out.println( "Error processing row: " + Arrays.toString(inputRow));
                System.out.println( "Error details: column '" + error.getColumnName() + "' (index " + error.getColumnIndex() + ") has value '" + inputRow[error.getColumnIndex()] + "'");
            }
        });
        parserSettings.setProcessorErrorHandler(new RetryableErrorHandler<ParsingContext>() {
            @Override
            public void handleError(DataProcessingException error, Object[] inputRow, ParsingContext context) {
                System.out.println("Error processing row: " + Arrays.toString(inputRow));
                System.out.println( "Error details: column '" + error.getColumnName() + "' (index " + error.getColumnIndex() + ") has value '" + inputRow[error.getColumnIndex()] + "'. Setting it to null");

                System.out.println("error.getColumnIndex()"+ error.getColumnIndex());
                if(error.getColumnIndex() == 0){
                    setDefaultValue(null);
                } else {
                    keepRecord(); //prevents the parser from discarding the row.
                }
            }
        });
        List<String[]> errorRecords = new ArrayList<String[]>();

        CsvParser parser = new CsvParser(parserSettings);
        try{
        parser.beginParsing(new FileReader(Paths.get("/src/main/resources/bean_test.csv").toFile()));

            Record row;
            int rownum=0;

            while ((row = parser.parseNextRecord()) != null) {
                rownum++;
                System.out.println("rownum : " + rownum);
                System.out.println("rowvalue : " + row.getValues());
                errorRecords.add(row.getValues());
            }
        } catch (TextParsingException exception) {
            //The exception will give you better details about what went wrong, and where.
            System.out.println("Quote escape error. Parser stopped after reading:  Record Number " + exception.getRecordNumber()+" ['" + exception.getParsedContent() + "'] of column " + exception.getColumnIndex());
            for(String[] it : errorRecords)    {
                System.out.println("Exception : "+ it.toString());
            }
        }

    }
...