在java中解析CSV文件,并使用空值进行delaing

时间:2015-08-18 09:08:51

标签: java arrays csv indexoutofboundsexception

我正在将CSV文件解析到我的程序中,在,元素处拆分值,并且它工作正常,除非我的行具有缺失值。

解析器的工作方式如下:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class CsvReader
{
    private static final String DELIMITER = ",";
    private final BufferedReader br;
    private final String path;

    public CsvReader(final String path) throws IOException
    {
        this.path = path;
        this.br = new BufferedReader(new FileReader(path));
    }

    public String[] nextLine() throws IOException
    {
        final String line = br.readLine();
        return (line == null) ? new String[0] : line.split(DELIMITER);
    }
}

数据行如下所示(以一行为例):

J1024205,5028197000004,1,,00,20150603,,Accessories,Factory Test Article (m),ENG,010,110,5,T1,99,99,,,99,99,99,ZZ,ZZ,,5028197242053,30,35028197242054,6,,,OPZ848,3013607800239,OPZ848,,,,50,,

文件中的大多数行都包含:50,85028197242127,8640

但在某些方面,数据缺失,因此结尾如下:50,,

处理文件时,这些行会导致java.lang.ArrayIndexOutOfBoundsException

如果我知道文件中的对象数量将保持不变,我该如何才能最好地解决这个问题呢?

我被告知我需要用空值替换空值。

4 个答案:

答案 0 :(得分:11)

来自String.split(regex)

的Javadoc
  

此方法的工作方式就像调用带有给定表达式和limit参数为零的双参数split方法一样。 因此,结尾数组中不包含尾随空字符串

因此,在您的情况下,当字符串以,,结尾时,空字符串不会成为结果数组的一部分。

要修复:使用此分割

的变体
line.split(DELIMITER, -1);

这将包括所有尾随空字符串。所以你不会得到例外。

答案 1 :(得分:1)

如果列为空,此代码将导致数组元素为空。

+

答案 2 :(得分:0)

你也可以这样。只需在用逗号

返回的String上调用split方法
public String replaceNullSplitLine(String line){
    if(line.endsWith(",")){
        line = line+"***";
    }
    line = line.replaceAll(",,", ",***,");
    return line;
}

答案 3 :(得分:-1)

在尝试使用最后一个(在这种情况下不存在)值之前检查数组的长度

myArray.length