LG :
난 자바 스프링 MVC와 @CsvBindAndSplitByPosition 주석을 사용하여 CSV 파일을 읽기 위해 노력하고 있어요,하지만 내 날짜 목록을 구문 분석하는 문제가있다.
이 내 객체입니다
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;
}
}
내 서비스에 대한 구현 :
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();
}
}
}
그리고 난은 컨트롤러에서이 서비스를 호출합니다.
이것은 내가 읽고 싶어하는 CSV 파일입니다 :
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
아래 같은 오류 :
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)
마르코 Behler :
당신은 헤더 행 당신의 CSV의 첫 줄을 건너 뛰는되지 않기 때문입니다.
첫 번째 줄을 건너 뛸 여기에 코드를 변경합니다 (참고 : .withSkipLines)
List<UserBindAndSplitByPosition> list = new CsvToBeanBuilder(new FileReader(file))
.withType(UserBindAndSplitByPosition.class)
.withSkipLines(1)
.build().parse();
System.out.println(list);