usando de @CsvBindAndSplitByPosition para ler arquivo CSV

LG:

Eu estou tentando ler um arquivo CSV usando anotação @CsvBindAndSplitByPosition com Spring MVC java, mas há um problema na análise de minha lista de datas.

este é o meu objeto:

import com.opencsv.bean.*;
import java.util.Date;
import java.util.List;
import java.util.SortedSet;

public class UserBindAndSplitByPosition {
    @CsvBindByPosition(position = 0)
    private String Name;
    @CsvBindByPosition(position = 1)
    private String Email;
    @CsvBindByPosition(position = 2)
    private String Address;
    @CsvBindAndSplitByPosition(position = 3, elementType = String.class)
    private List<String> PhoneNumbers;
    @CsvBindAndSplitByPosition(position = 4, elementType = Date.class, splitOn = ";+")
    @CsvDate(value="yyyy-MM-dd")
    SortedSet<Date> Dates;

    public List<String> getPhoneNumbers() {
        return PhoneNumbers;
    }

    public void setPhoneNumbers(List<String> phoneNumbers) {
        PhoneNumbers = phoneNumbers;
    }

    public SortedSet<Date> getDates() {
        return Dates;
    }

    public void setDates(SortedSet<Date> dates) {
        Dates = dates;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public String getEmail() {
        return Email;
    }

    public void setEmail(String email) {
        Email = email;
    }

    public String getAddress() {
        return Address;
    }

    public void setAddress(String address) {
        Address = address;
    }

}

a implementação para o meu serviço:

import com.csvRead.Repositories.UserBindAndSplitByName;
import com.csvRead.Repositories.UserBindAndSplitByPosition;
import com.opencsv.bean.CsvToBeanBuilder;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.List;

@Service("CsvBindAndSplitByPosition")
public class CsvBindAndSplitByPosition implements ReadWithAnnotation {
    @Override
    public void read(File file) {
        try {
            List<UserBindAndSplitByPosition> list = new CsvToBeanBuilder(new FileReader(file))
                    .withType(UserBindAndSplitByPosition.class)
                    .build().parse();
            System.out.println(list);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

E eu chamo este serviço no controlador.

este é o arquivo CSV que eu quero ler:

User Name,User Email,Address,Phone Numbers,Dates
liena yasir omer,[email protected],oumdurman,0912792888 1111111111 5555555555,2020-03-10T12:39:51.676
huda yasir omer,email@gmail,oman,1111111111 2222222222 1234567890,2020-03-10T12:39:51.676;;;2020-03-10T12:39:51.676

eo erro como abaixo:

Exception in thread "pool-1-thread-1" java.lang.RuntimeException: com.opencsv.exceptions.CsvDataTypeMismatchException
    at com.opencsv.bean.concurrent.ProcessCsvLine.run(ProcessCsvLine.java:99)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:830)
Caused by: com.opencsv.exceptions.CsvDataTypeMismatchException
    at com.opencsv.bean.ConverterDate.convertToRead(ConverterDate.java:299)
    at com.opencsv.bean.BeanFieldSplit.convert(BeanFieldSplit.java:189)
    at com.opencsv.bean.AbstractBeanField.setFieldValue(AbstractBeanField.java:180)
    at com.opencsv.bean.AbstractMappingStrategy.setFieldValue(AbstractMappingStrategy.java:581)
    at com.opencsv.bean.AbstractMappingStrategy.populateNewBean(AbstractMappingStrategy.java:328)
    at com.opencsv.bean.concurrent.ProcessCsvLine.processLine(ProcessCsvLine.java:128)
    at com.opencsv.bean.concurrent.ProcessCsvLine.run(ProcessCsvLine.java:83)
    ... 3 more
Caused by: java.text.ParseException: Unparseable date: "Dates"
    at java.base/java.text.DateFormat.parse(DateFormat.java:395)
    at com.opencsv.bean.ConverterDate.convertToRead(ConverterDate.java:286)
    ... 9 more
Mar 29, 2020 11:02:22 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: Error parsing CSV line: 1. [User Name,User Email,Address,Phone Numbers,Dates]] with root cause
java.text.ParseException: Unparseable date: "Dates"
    at java.base/java.text.DateFormat.parse(DateFormat.java:395)
    at com.opencsv.bean.ConverterDate.convertToRead(ConverterDate.java:286)
    at com.opencsv.bean.BeanFieldSplit.convert(BeanFieldSplit.java:189)
    at com.opencsv.bean.AbstractBeanField.setFieldValue(AbstractBeanField.java:180)
    at com.opencsv.bean.AbstractMappingStrategy.setFieldValue(AbstractMappingStrategy.java:581)
    at com.opencsv.bean.AbstractMappingStrategy.populateNewBean(AbstractMappingStrategy.java:328)
    at com.opencsv.bean.concurrent.ProcessCsvLine.processLine(ProcessCsvLine.java:128)
    at com.opencsv.bean.concurrent.ProcessCsvLine.run(ProcessCsvLine.java:83)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:830)

Marco Behler:

Isso é porque você não está ignorando a primeira linha do seu CSV, que é a linha de cabeçalho.

Alterar o código para este pular a primeira linha (nota: .withSkipLines)

 List<UserBindAndSplitByPosition> list = new CsvToBeanBuilder(new FileReader(file))
                    .withType(UserBindAndSplitByPosition.class)
                    .withSkipLines(1)
                    .build().parse();
            System.out.println(list);

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=365887&siteId=1
Recomendado
Clasificación