使用FlatFileItemReader讀取csv文件時,有一列映射類型為Int,但該列在csv文件中為空(eg:.6321517,Jack, 1,,最后兩列為空)。java.lang.NumberFormatException: Unparseable number解析文件時拋出異常( )數據集CUSTR_NBR,SUR_NAME,CHECK_FLAG,RESN_CODE6321517,Jack,1,,首先解析第一行數據(CUSTR_NBR,SUR_NAME,CHECK_FLAG,RESN_CODE),所以我設置.SetLinesToSkip(1). 但如果解析出空值,對應的“CHECK_FLAG”和“RESN_CODE”就無法正常執行。我相信有相應的配置項。我查看了springbatch的文檔,沒有找到相關的配置項。csvItemReader @Bean @StepScope public FlatFileItemReader<InfoDTO> csvItemReader() { FlatFileItemReader<InfoDTO> csvItemReader = new FlatFileItemReader<>(); csvItemReader.setResource(new ClassPathResource("data/charge-off.csv")); csvItemReader.setLinesToSkip(1); DelimitedLineTokenizer tokenizer=new DelimitedLineTokenizer(); String[] tokens = new String[]{"CUSTR_NBR","SUR_NAME","CHECK_FLAG","RESN_CODE","EMPNO"}; tokenizer.setNames(tokens); DefaultLineMapper<InfoDTO> lineMapper=new DefaultLineMapper<InfoDTO>(); lineMapper.setLineTokenizer(tokenizer); lineMapper.setFieldSetMapper(new InfoFileMapper()); lineMapper.afterPropertiesSet(); csvItemReader.setLineMapper(lineMapper); return csvItemReader; }映射器 public class InfoFileMapper implements FieldSetMapper<ChargeOffBatchDTO> { @Override public InfoDTO mapFieldSet(FieldSet fieldSet) throws BindException { if(fieldSet == null){ return null; } return new InfoDTO( fieldSet.readString("CUSTR_NBR"), fieldSet.readString("SUR_NAME"), fieldSet.readString("CHECK_FLAG"), fieldSet.readInt("RESN_CODE"), fieldSet.readInt("EMPNO") ); } }我需要將空列映射為0值,如何配置?
2 回答
小怪獸愛吃肉
TA貢獻1852條經驗 獲得超1個贊
我沒有使用過 Spring Batch,但查看FieldSet Interface 規范,似乎有一些替代方法可以實現您想要的目標。
然而, Spring?Batch 參考確實提到了一些容錯能力,特別是當值不存在時拋出異常。為了禁用此功能,您需要將 strict 設置為false
tokenizer.setStrict(false);
否則,您可以簡單地嘗試一些舊的時尚替代方案,例如不要嘗試將值直接讀入 an?int,只需將其讀入 String ,然后在將其轉換為 String 之前驗證該 Stringint
String empNo = fieldSet.readString("EMPNO");
if ((empNo == null) || (empNo.equals(""))) {
? empNo = "0";
}
int i = Integer.valueOf(empNo);
如果字段不為空且不是字符串,您可能仍然會得到一個java.lang.NumberFormatException,所以就我個人而言,我會通過處理異常來解決問題:
int myEmp = 0;
try {
? myEmp = fieldSet.readInt("EMPNO");
} catch (NumberFormatException nfe) {
? myEmp = 0;
}
也許不是那么雄辯,但它會起作用并達到目的。
添加回答
舉報
0/150
提交
取消
