OpenCsv - 在字段上设置自定义验证
OpenCsv - set custom validation on field
我正在使用 OpenCsv 将 csv 文件转换为 Java Bean。
我的文件如下所示:
USER_NAME, USER_ID, FREQUENCY
aaa,111,DAILY
bbb,222,WEEKLY,
ccc,333,MONTHLY
ddd,444,SOME_RANDOM_VALUE
eee,555,YEARLY
我需要对列执行以下验证:
USER_NAME -> not null, alphabets only
USER_ID -> not null, digits only
FREQUENCY -> not null, allowed values - DAILY, WEEKLY, MONTHLY, YEARLY
对于 FREQUENCY 的任何其他值,记录 USER_NAME 列,如下所示:
ddd,频率
我只需要记录行和流程照常继续,即 'eeee' 应该映射到 java bean。
基于Opencsv custom logic in parcing,我在java bean中创建了以下逻辑。
问题是流程以 'dddd' 停止并且 'eeee' 未映射。
class UserBean {
private String userName;
private String userID;
private String frequency;
//Getters and Setters for userName, userID
public void setFrequency(String frequency) {
if(frequency.isEmpty() && !(frequency.equalsIgnoreCase("DAILY") && frequency.equalsIgnoreCase("WEEKLY") && frequency.equalsIgnoreCase("MONTHLY") && frequency.equalsIgnoreCase("YEARLY"))) {
throw new IllegalArgumentException("Invalid value for FREQUENCY");
}
}
}
public static void main() {
CsvToBean<UserBean> csvToBean = new CsvToBean<UserBean>();
Reader reader = new FileReader((File) INPUT_DIR);
csvToBean = new CsvToBeanBuilder(reader).withSeparator(',')
.withType(User.class)
.withOrderedResults(true)
.withIgnoreLeadingWhiteSpace(true)
.build();
Iterator<PrimeAOBean> csvUserIterator = csvToBean.iterator();
List<Exception> exceptionList = new ArrayList<Exception>();
while (csvUserIterator.hasNext()) {
try {
UserBean userBean = csvUserIterator.next();
userDataMap.put(userBean.getUserID(), userBean);
}
catch(Exception e) {
exceptionList.add(e);
continue;
}
finally {
FileWriter fileWriter = new FileWriter(ERROR_DIR);
PrintWriter printWriter = new PrintWriter(fileWriter);
for (Exception excep: exceptionList) {
printWriter.print(excep.getLocalizedMessage());
printWriter.close();
}
continue;
}
}
}
您可以添加 .withThrowExceptions(false) 以忽略运行时异常,如所述
我正在使用 OpenCsv 将 csv 文件转换为 Java Bean。
我的文件如下所示:
USER_NAME, USER_ID, FREQUENCY
aaa,111,DAILY
bbb,222,WEEKLY,
ccc,333,MONTHLY
ddd,444,SOME_RANDOM_VALUE
eee,555,YEARLY
我需要对列执行以下验证:
USER_NAME -> not null, alphabets only
USER_ID -> not null, digits only
FREQUENCY -> not null, allowed values - DAILY, WEEKLY, MONTHLY, YEARLY
对于 FREQUENCY 的任何其他值,记录 USER_NAME 列,如下所示: ddd,频率
我只需要记录行和流程照常继续,即 'eeee' 应该映射到 java bean。
基于Opencsv custom logic in parcing,我在java bean中创建了以下逻辑。
问题是流程以 'dddd' 停止并且 'eeee' 未映射。
class UserBean {
private String userName;
private String userID;
private String frequency;
//Getters and Setters for userName, userID
public void setFrequency(String frequency) {
if(frequency.isEmpty() && !(frequency.equalsIgnoreCase("DAILY") && frequency.equalsIgnoreCase("WEEKLY") && frequency.equalsIgnoreCase("MONTHLY") && frequency.equalsIgnoreCase("YEARLY"))) {
throw new IllegalArgumentException("Invalid value for FREQUENCY");
}
}
}
public static void main() {
CsvToBean<UserBean> csvToBean = new CsvToBean<UserBean>();
Reader reader = new FileReader((File) INPUT_DIR);
csvToBean = new CsvToBeanBuilder(reader).withSeparator(',')
.withType(User.class)
.withOrderedResults(true)
.withIgnoreLeadingWhiteSpace(true)
.build();
Iterator<PrimeAOBean> csvUserIterator = csvToBean.iterator();
List<Exception> exceptionList = new ArrayList<Exception>();
while (csvUserIterator.hasNext()) {
try {
UserBean userBean = csvUserIterator.next();
userDataMap.put(userBean.getUserID(), userBean);
}
catch(Exception e) {
exceptionList.add(e);
continue;
}
finally {
FileWriter fileWriter = new FileWriter(ERROR_DIR);
PrintWriter printWriter = new PrintWriter(fileWriter);
for (Exception excep: exceptionList) {
printWriter.print(excep.getLocalizedMessage());
printWriter.close();
}
continue;
}
}
}
您可以添加 .withThrowExceptions(false) 以忽略运行时异常,如所述