Java读取CSV时split拆分列报数组越界 如何正确获取各列值
问题排查与解决方法
问题根因
你遇到的报错本质不是split方法的问题,是Scanner的读取方法使用错误:
Scanner的next()方法默认以所有空白符(空格、换行符、制表符等)作为分隔边界,调用时只会读取到下一个空白符前的内容。你的时间戳字段包含空格,所以next()只会读到日期部分(2019-05-07)就返回,根本拿不到完整的一行数据,拆分后数组长度自然不符合预期。- 你跳过表头的写法也有问题:用
next()跳首行只会读取表头第一部分,剩余的表头内容还留在缓冲区,第一次循环读取的还是表头剩余内容,也会触发下标越界。
修正方案
把读取方法换成nextLine()读取完整行即可,修正后的代码如下:
public static void main(String[]args){ String blah = "file.csv"; File file = new File(blah); try{ Scanner iterate = new Scanner(file); iterate.nextLine(); // 用nextLine跳过完整的表头行 while(iterate.hasNextLine()){ String data = iterate.nextLine(); // 读取完整的一行数据 String[] values = data.split(","); // 注意列索引从0开始:timestamp是0,Column1是1,column2是2,column3是3 String column3Val = values[3].trim(); // 加trim去除列值前后的多余空格 // 如果需要转Float,确认column3的值是合法数字格式再转 // Float nbr = Float.parseFloat(column3Val); System.out.println(column3Val); } iterate.close(); }catch (FileNotFoundException e){ e.printStackTrace(); } }
补充说明
- 如果你的CSV存在字段内包含逗号、引号等复杂场景,更推荐使用第三方CSV处理库处理,避免手动拆分的边界问题。
- 下标访问前可以先判断
values.length >=4,避免个别行格式异常导致程序崩溃。
内容的提问来源于stack exchange,提问作者Donald Dang
相关产品推荐
相关产品推荐

