java中的Parse.csv文件返回outofbounds异常

java中的Parse.csv文件返回outofbounds异常,java,csv,indexoutofboundsexception,Java,Csv,Indexoutofboundsexception,我有以下问题:我试图用java解析一个.csv文件,并将其中的3列存储在一个二维数组中。该方法的代码如下所示: public static void parseFile(String filename) throws IOException{ FileReader readFile = new FileReader(filename); BufferedReader buffer = new BufferedReader(readFile); String li

我有以下问题:我试图用java解析一个.csv文件,并将其中的3列存储在一个二维数组中。该方法的代码如下所示:

    public static void parseFile(String filename) throws IOException{
    FileReader readFile = new FileReader(filename); 
    BufferedReader buffer = new BufferedReader(readFile);
    String line; 
    String[][] result = new String[10000][3];
    String[] b = new String[6];

    for(int i = 0; i<10000; i++){
            while((line = buffer.readLine()) != null){
                b = line.split(";",6);
                System.out.println("ID: "+b[0]+" Title: "+b[3]+ "Description: "+b[4]); // Here is where the outofbounds exception occurs...


                result[i][0] = b[0];
                result[i][1] = b[3];    
                result[i][2] = b[4];
                }
            }
            buffer.close();

}
然而,我意识到文件中的一些内容有一种奇怪的格式,例如,文件中的一些文本中有换行符,但没有任何方式涉及换行符。但是,如果手动删除这些空行,则生成的输出(在提示错误消息之前)会将内容添加到数组中,直到下一个空行。。。
有人知道如何解决这个问题吗?当您的CSV文件中有新行时,在此行之后,将非常感谢您的任何帮助…

而((line=buffer.readLine())!=null){ 变量行没有CSV行,只有一些没有CSV行的文本

例如,如果您有文件

column1;column2;column
3 value
在第一次迭代之后,变量行将具有

列1;列2;列

在第二次迭代之后,它将具有 3值

当您调用“3 value.split(;”,6)时,它将返回包含一个元素的数组。稍后当您调用b[3]时,它将抛出异常

CSV格式有很多小东西,要实现这些东西你需要花费很多时间。这是一篇关于所有可能的CSV示例的好文章

我会向您推荐一些像这样的现成CSV解析器


您的第一个问题是您的csv文件中可能至少有一个空行。您需要替换:

b = line.split(";", 6);


如果这是一个重复多次的过程,你可能需要考虑使用一个扫描器(或库)来获得更有效的文本处理。否则,你可以使用它。

< P>请在访问<代码> B[]/Cord>之前,检查<代码> B长度> 0代码> .< /P>

字符串的分割(模式,限制)方法返回一个数组,该数组的大小为找到的令牌数和limit参数指定的数目。limit是返回的最大数组元素数,而不是最小数组元素数

“1,2,3”用(“,”,6)拆分,返回一个由3个元素组成的数组:“1”、“2”和“3”

“1,2,3,4,5,6,7”将返回6个元素:“1”、“2”、“3”、“4”、“5”和“6,7”最后一个元素是goofy,因为split方法在5之后停止拆分,并将源字符串的其余部分作为第六个元素返回

空行表示为空字符串(“”)。拆分“”将返回一个包含1个元素的数组,即空字符串

在您的例子中,这里创建的字符串数组

String[] b = new String[6];
并将分配给b的数组替换为

b = line.split(";",6);
最终命运掌握在看不见也不被爱的垃圾收集器手中

更糟糕的是,在空行的情况下,它被一个单元素数组替换,所以

System.out.println("ID: "+b[0]+" Title: "+b[3]+ "Description: "+b[4]);
尝试访问b[3]时爆炸

建议的解决方案是:

while((line = buffer.readLine()) != null){
    if (line.length() != 0)
    {
            b = line.split(";",6);
            System.out.println("ID: "+b[0]+" Title: "+b[3]+ "Description: "+b[4]); // Here is where the outofbounds exception occurs...
        ...
    }
或者(更好,因为前一条可能会被格式错误的线路绊倒)

你可能还想考虑一下for循环,我认为这对你没有任何好处

 while((line = buffer.readLine()) != null)
将读取文件中的每一行,所以

for(int i = 0; i<10000; i++){
        while((line = buffer.readLine()) != null){

for(int i=0;在CSV中有新的行是可能的。例如,这些示例是正确的CSV(从这里复制)
1997,福特,E350,“现在就去拿一辆吧,他们走得很快”
1997,福特,E350,“超级豪华卡车”
也要想一想,如果你有了,你会怎么做;或者作为列值。这是一个很好的观点,我假设他可以控制他的输入,因为他提到输入中没有嵌入新行字符,但是作为一个通用解决方案,应该注意的是,它只在没有任何额外新行或分号的情况下工作……感谢您的反馈。您的解决方案有效,输出通用测试整个.csv文件,并在运行时成功提示err mess到控制台!…在split()中需要使用哪种类型的正则表达式为了忽略字符串中的;,而在.csv文件的单元格之间保持拆分…?不幸的是,一旦必须处理转义规则,就会出现上下文相关的解析问题,并且这些问题不能很好地用reg-exe处理。如果必须处理它们,最好使用csv PAR呃,比如下面提到的解析器。你确定只要检查数组大小是否大于
0
,就可以解决这个问题。他得到的是
java.lang.ArrayIndexOutOfBoundsException:3
。你可能会重新考虑你的答案
while((line = buffer.readLine()) != null){
    if (line.length() != 0)
    {
            b = line.split(";",6);
            System.out.println("ID: "+b[0]+" Title: "+b[3]+ "Description: "+b[4]); // Here is where the outofbounds exception occurs...
        ...
    }
while((line = buffer.readLine()) != null){
    b = line.split(";",6);
    if (b.length() == 6)
    {
            System.out.println("ID: "+b[0]+" Title: "+b[3]+ "Description: "+b[4]); // Here is where the outofbounds exception occurs...
        ...
    }
 while((line = buffer.readLine()) != null)
for(int i = 0; i<10000; i++){
        while((line = buffer.readLine()) != null){