无法通过Apache Commons CSV读取超过记录的内容

时间:2019-01-06 04:33:26

标签: java spring csv spring-boot apache-commons-csv

我有这样的csv文件:-

a,b,c,d       //<- header
0.1,0.123,2.13,3.22
0.3,0.213,2.11,3.12
0.5,0.231,2.3,3.21
0.7,0.121,2.26,3.321

我正在使用apache commons csv读取csv文件。

我制作了与上述csv文件相对应的POJO, 命名为CSVInputFileModel类。

下面是我用来读取文件的方法:-

private List<CSVInputFileModel> inputCSVData;


void fileParser() throws IOException {
        Reader in = new FileReader(INPUT_CSV_FILE);
        Iterable<CSVRecord> records = CSVFormat.RFC4180.withFirstRecordAsHeader().parse(in);

        for (CSVRecord record : records) {
            // Adding each record to array list

            CSVInputFileModel csvInputFileModel = new CSVInputFileModel();

            csvInputFileModel.setA(Double.parseDouble(record.get("a")));
            csvInputFileModel.setB(Double.parseDouble(record.get("b")));
            csvInputFileModel.setC(Double.parseDouble(record.get("c")));
            csvInputFileModel.setD(Double.parseDouble(record.get("d")));

            inputCSVData.add(csvInputFileModel); //<-- NPE at second iteration
        }
        System.out.println(inputCSVData);
    }

下面是CSVInputFileModel类

public class CSVInputFileModel {
private double a;
private double b;
private double c;
private double d;

public CSVInputFileModel() {

}
  //All args constructor
//hashcode equals
//getter setters
//toString
}

以下代码提供空指针异常。 当我运行调试器时,我发现在第一次迭代中,apache csv commons能够读取csv文件的第一条记录,而它是第二次迭代,它给出了空指针异常。 / strong>

我无法弄清楚我做错了什么!。

2 个答案:

答案 0 :(得分:2)

首先,我确定您正在成功读取第一条记录,但是不可能将其添加到列表中,所以:

  • 您正在使用Enhaced for循环,这意味着第二条记录在那里,这不是您的问题。
  • CSVInputFileModel似乎是正确的。
  • 您声明了inputCSVData,但未实例化。

我的结论是您错过了输入列表实例,这就是为什么要输入第一个迭代,但绝不要输入第二个迭代的原因。

在尝试在代码中添加元素以修复它之前解决inputCSVData = new ArrayList<CSVInputFileModel>()这个问题。

答案 1 :(得分:2)

我已使用您的代码进行必要的更改,并且工作正常。

public class Test {
public static void main(String[] args) throws IOException {
    fileParser();
}

static void fileParser() throws IOException {
    Reader in = new FileReader("abc.csv");
    Iterable<CSVRecord> records = CSVFormat.RFC4180.withFirstRecordAsHeader().parse(in);
    List<CSVInputFileModel> inputCSVData = new ArrayList<>();
    for (CSVRecord record : records) {
        // Adding each record to array list

        CSVInputFileModel csvInputFileModel = new CSVInputFileModel();

        csvInputFileModel.setA(Double.parseDouble(record.get("a")));
        csvInputFileModel.setB(Double.parseDouble(record.get("b")));
        csvInputFileModel.setC(Double.parseDouble(record.get("c")));
        csvInputFileModel.setD(Double.parseDouble(record.get("d")));

        inputCSVData.add(csvInputFileModel); // <-- NPE at second iteration
    }
    for (CSVInputFileModel data : inputCSVData) {
        System.out.println(data.getA() + ":" + data.getB() + ":" + data.getC() + ":" + data.getD());
    }
}

}