Чтение файла CSV с использованием FlatFileItemReader, выдавая исключение при обнаружении пустого столбца - PullRequest
0 голосов
/ 29 сентября 2019

При использовании FlatFileItemReader для чтения файла csv тип отображения столбца - Int, но этот столбец является нулевым в файле csv (например: 6321517,Jack, 1,,. Последние два столбца пусты).Исключение (java.lang.NumberFormatException: Unparseable number) выдается при разборе файла

csv

CUSTR_NBR,SUR_NAME,CHECK_FLAG,RESN_CODE
6321517,Jack,1,,

Первая строка данных (CUSTR_NBR, SUR_NAME, CHECK_FLAG, RESN_CODE) анализируется сначала, поэтому яустановить .SetLinesToSkip(1).Тем не менее, соответствующие «CHECK_FLAG» и «RESN_CODE» не могут быть выполнены нормально, если анализируется нулевое значение.Я считаю, что есть соответствующий элемент конфигурации.Я просмотрел документацию для Springbatch и не смог найти связанных элементов конфигурации.

csvItemReader

    @Bean
    @StepScope
    public FlatFileItemReader<InfoDTO> csvItemReader() {
        FlatFileItemReader<InfoDTO> csvItemReader = new FlatFileItemReader<>();
        csvItemReader.setResource(new ClassPathResource("data/charge-off.csv"));
        csvItemReader.setLinesToSkip(1);

        DelimitedLineTokenizer tokenizer=new DelimitedLineTokenizer();
        String[] tokens = new String[]{"CUSTR_NBR","SUR_NAME","CHECK_FLAG","RESN_CODE","EMPNO"};
        tokenizer.setNames(tokens);
        DefaultLineMapper<InfoDTO> lineMapper=new DefaultLineMapper<InfoDTO>();
        lineMapper.setLineTokenizer(tokenizer);
        lineMapper.setFieldSetMapper(new InfoFileMapper());
        lineMapper.afterPropertiesSet();
        csvItemReader.setLineMapper(lineMapper);

        return csvItemReader;
    }

mapper

    public class InfoFileMapper implements FieldSetMapper<ChargeOffBatchDTO> {
        @Override
        public InfoDTO mapFieldSet(FieldSet fieldSet) throws BindException {

            if(fieldSet == null){
                return null;
            }

            return new InfoDTO(
                fieldSet.readString("CUSTR_NBR"),
                fieldSet.readString("SUR_NAME"),
                fieldSet.readString("CHECK_FLAG"),
                fieldSet.readInt("RESN_CODE"),
                fieldSet.readInt("EMPNO")
            );
        }
    }

Мне нужно сопоставить нулевой столбецдо значения 0. Как настроить 101

1 Ответ

0 голосов
/ 29 сентября 2019

Я не работал с Spring Batch, но, глядя на спецификацию FieldSet Interface , кажется, что есть несколько альтернативных способов достижения желаемого.

Ссылка Spring Batch , тем не менее, упоминает некоторую отказоустойчивость, особенно в отношении исключения, когда значение не существует.Для того, чтобы отключить это, вам нужно установить строгое значение false

tokenizer.setStrict(false);

В противном случае вы можете просто попробовать некоторые альтернативы старой моды, например, вместо того, чтобы пытаться прочитать значение непосредственно в int,просто прочитайте его в строку, а затем проверьте эту строку перед приведением ее к int

String empNo = fieldSet.readString("EMPNO");
if ((empNo == null) || (empNo.equals(""))) {
  empNo = "0";
}
int i = Integer.valueOf(empNo);

Вы все равно можете получить java.lang.NumberFormatException, если поле не пустое и не является строкой, поэтому лично япросто решит проблему, обработав исключение:

int myEmp = 0;
try {
  myEmp = fieldSet.readInt("EMPNO");
} catch (NumberFormatException nfe) {
  myEmp = 0;
}

Возможно, это не так красноречиво, но это сработает и будет соответствовать цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...