#java #string #csv #localdate #univocity
#java #строка #csv #localdate #однозначность
Вопрос:
Я использую CSVParser от Univocity для чтения файла CSV. Мой POJO выглядит примерно так.
import java.time.LocalDate;
import com.univocity.parsers.annotations.NullString;
import com.univocity.parsers.annotations.Parsed;
import lombok.Builder;
import lombok.Getter;
@Getter
@Setter
public class TempClass {
@Parsed(field = "A")
private int a;
@Parsed(field = "B")
private String b;
@Parsed(field = "C")
private LocalDate c;
}
Мой файл CSV выглядит примерно так:-
A,B,C
1,"Hi","2019-01-12"
2,"Hey","2019-01-13"
3,"Hello","2019-01-14"
Теперь, когда я пытаюсь прочитать этот файл с помощью CsvParser, он выдает сообщение об ошибке Unable to set value '2019-01-12' of type 'java.lang.String' to field attribute 'c'
.
Здесь я предполагаю, что это выдает ошибку, потому что она не может неявно преобразовать String
в LocalDate
. Если это так, то как он может преобразовать String
в int
?
Есть ли способ устранить ошибку Unable to set value '2019-01-12' of type 'java.lang.String' to field attribute 'c'
?(без изменения типа данных TempClass.c
)
Ответ №1:
Univocity-parsers по-прежнему построен на Java 6. LocalDate
напрямую не поддерживается из коробки, но может обеспечить преобразование самостоятельно. Что-то вроде:
public class LocalDateFormatter implements Conversion<String, LocalDate> {
private DateTimeFormatter formatter;
public LocalDateFormatter(String... args) {
String pattern = "dd MM yyyy";
if(args.length > 0){
pattern = args[0];
}
this.formatter = DateTimeFormatter.ofPattern(pattern);
}
@Override
public LocalDate execute(String input) {
return LocalDate.parse(input, formatter);
}
@Override
public String revert(LocalDate input) {
return formatter.format(input);
}
}
Затем аннотируйте свои поля с помощью @Convert
и укажите свой класс преобразования:»
@Parsed(field = "C")
@Convert(conversionClass = LocalDateFormatter.class, args = "yyyy-MM-dd")
private LocalDate c;
Скоро выйдет следующая версия (3.0.0) с поддержкой этого и многого другого.
Надеюсь, это поможет.