序言
有个需求要将csv文件入库,之前测试的文件都是可以正常解析入库的,但新提供的一个csv文件读取的时候捕获的异常信息就总是提示:Index 1 out of bounds for length 1。
读取csv文件的方法
public static List<Map<String, Object>> readExcelForCsvPlus(InputStream inputStream, List<Map<String, Object>> dataMappingMap,Integer startLine) {List<Map<String, Object>> result = new ArrayList<>();//key = dataNo, value = filedNameMap<Integer, String> dataNoAndFieldNameMap = dataMappingMap.stream().collect(Collectors.toMap(map -> (Integer) map.get(CommonConstant.DATA_NO),map -> (String) map.get(CommonConstant.FIELD_NAME)));try (CSVReader reader = new CSVReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {String[] line;int cnt = 1;while ((line = reader.readNext()) != null) {// 忽略行if (startLine > cnt) {cnt ++;continue;}Map<String, Object> map = Maps.newLinkedHashMap();for (int i = 0; i < dataNoAndFieldNameMap.size(); i++) {String filedName = dataNoAndFieldNameMap.get(i + 1);map.put(filedName, line[i].trim());}result.add(map);cnt ++;}} catch (Exception e) {throw new ServiceException("读取csv文件异常,异常信息为:" + e.getMessage());}return result;}
这里解释下入参:读取的ftp的文件流inputStream,数据集合dataMappingMap,读取的文件起始行号。
自己debug了很多次,还是没有找到原因,后面看到了这篇博客:由于CSV中的换行导致ArrayIndexOutOfBounds异常
大概也猜到是文件本身的问题是有空格的,这个问题和提供文件的同事沟通了下,文件尾确实有两行空行。肉眼可见文件读取完成的result确实和有数据的行数是对应的,但尝试对line数组长度进行判空还是会报这个错,最后在for循环里打印了i才知道,i=1的时候报错的,那就说明line的长度不是0而是1,最后加了下面的判断就可以顺利读完整个文件了:
-----------------知道的越多,不知道的越多---------------