【问题标题】:Parse CSV file in java, and delaing with empty values在 Java 中解析 CSV 文件,并处理空值
【发布时间】:2015-11-11 03:17:46
【问题描述】:

我正在将一个 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

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

有人告诉我,我需要用空值替换空值。

【问题讨论】:

  • 在进行拆分之前,使用 line.replace 将 '' 替换为 'null'。因为你需要用 null 替换空值。
  • @JishnuPrathap 他的意思是空值而不是“空”字符串:)

标签: java arrays csv indexoutofboundsexception


【解决方案1】:

来自String.split(regex)的Javadoc

此方法的工作方式就像通过使用给定表达式和零限制参数调用双参数拆分方法一样。 因此结果数组中不包含尾随的空字符串

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

修复:使用这种拆分变体

line.split(DELIMITER, -1);

这将包括所有尾随的空字符串。所以你不会得到异常。

【讨论】:

  • 这是解决这个问题的最佳答案,因为一个空字段应该产生一个空字符串 :)
  • @haywire 没有 OP 需要空值的 null。
  • 所以,他使用 Codebender 的代码并将每个“”替换为 null。问题解决了。
  • 我已将其写在答案中以防万一。
【解决方案2】:

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

// ... rest of OP's code

public String[] nextLine() throws IOException
{
    final String line = br.readLine();

    if(line == null)
    {
        return null; 
    }

    String columns[] = line.split(DELIMITER, -1);

    for(int i = 0; i < columns.length; i++)
    {
        if(columns[i].isEmpty())
        {
            columns[i] = null;
        }
    }

    return columns;
}

【讨论】:

    【解决方案3】:

    你也可以这样。只需对以逗号返回的字符串调用 split 方法

    public String replaceNullSplitLine(String line){
        if(line.endsWith(",")){
            line = line+"***";
        }
        line = line.replaceAll(",,", ",***,");
        return line;
    }
    

    【讨论】:

      【解决方案4】:

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

      myArray.length

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-26
        • 2014-03-30
        • 2020-05-09
        • 2018-10-31
        • 1970-01-01
        • 2018-02-21
        • 2015-10-13
        相关资源
        最近更新 更多