using of @CsvBindAndSplitByPosition to read csv file

L.G :

i am trying to read a csv file using @CsvBindAndSplitByPosition annotation with java spring mvc,but there is a problem in parsing my dates list.

this is my object:

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;
    }

}

the implementation for my service:

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();
        }
    }
}

and i call this service in the the controller.

this is the csv file that i want to read:

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

and the error as below:

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 :

This is because you are not skipping the first line of your csv, which is the header line.

Change your code to this to skip the first line (note: .withSkipLines)

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

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=362097&siteId=1