【问题标题】:Not able to read more than record through Apache commons csv无法通过 Apache commons csv 读取超过记录
【发布时间】:2019-01-06 04:33:25
【问题描述】:

我有这样的 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 文件的第一条记录,而它是 第二次迭代,它给出了空指针异常。

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

【问题讨论】:

  • 如果将Iterable&lt;CSVRecord&gt; records 更改为CSVParser records 会怎样?
  • @Rcordoval 还是一样。第一条记录已成功添加到列表中,就在那个空指针异常之后!
  • 你能告诉我们你的 CSVInputFileModel 和 inputCSVData 变量在哪里吗?以及抛出 NPE 的行
  • @Rcordoval 我已经添加了详细信息..
  • 好的。现在,您的代码中的某处是 inputCSVData = new ArrayList()?这可能会在读取第二条记录之前导致 NPE。

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


【解决方案1】:

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

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

我的结论是你错过了输入列表实例,这就是为什么进入第一次迭代,但从来没有进入第二次。

要解决这个问题,请在尝试在代码中添加元素以修复它之前放置 inputCSVData = new ArrayList&lt;CSVInputFileModel&gt;()

【讨论】:

    【解决方案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());
        }
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 2020-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多