Проверяйте проанализированные поля с помощью Univocity Parser - PullRequest
0 голосов
/ 21 сентября 2018

Я хотел знать, есть ли способ проверить и проверить поле при использовании пакета CsvRoutines.По сути, я хочу обработать строку, если в первом столбце есть только числа, и пропустить /, возможно, вызвать исключение в противном случае.Я предполагаю, что аннотация @Validate, выпущенная в 2.7.0, может быть использована для достижения этой цели.Но я хотел бы знать, есть ли другой способ добиться того же с более ранними версиями, такими как 2.5.9?

1 Ответ

0 голосов
/ 21 сентября 2018

Автор библиотеки здесь.Там нет другого способа, кроме обновления до последней версии.Есть ли какая-то конкретная причина, по которой вы не можете обновить?

Обновление: вы можете поместить аннотации @Parsed в методы получения или установки класса и выполнить в них проверки.Это, наверное, самый чистый способ сделать это.Например:

class Test {

    private Integer number;

    //accepts a String here... so this is straight from the parser before it tries to convert anything into an integer - which lets you validate or throw a custom exception
    @Parsed
    void setNumber(String number){
        try{
            this.number = Integer.valueOf(number);
        } catch(NumberFormatException e){
            throw new IllegalArgumentException(number + " is not a valid integer");
        }
    }

}

Другой альтернативой является использование пользовательского класса преобразования.Скопируйте код класса ValidatedConversion , использованный в последней версии, затем создайте подкласс, например:

public static class RangeLimiter extends ValidatedConversion {
    int min;
    int max;

    public RangeLimiter(String[] args) {
        super(false, false); //not null, not blank
        min = Integer.parseInt(args[0]);
        max = Integer.parseInt(args[1]);
    }

    protected void validate(Object value) {
        super.validate(value); //runs the existing validations for not null and not blank
        int v = ((Number) value).intValue();
        if (v < min || v > max) {
            throw new DataValidationException("out of range: " + min + " >= " + value + " <=" + max);
        }
    }
}

Теперь в вашем коде используйте это:

@Parsed(field = "number")
@Convert(conversionClass = RangeLimiter.class, args = {"1", "10"}) //min = 1, max = 10
public int number;

Я не проверял это против старой версии.Я думаю, что вам может понадобиться установить флаг applyDefaultConversion=false в аннотации @Parsed и заставить ваш класс преобразования преобразовать String в int в дополнение к выполнению проверок.

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

...