代码之家  ›  专栏  ›  技术社区  ›  AConsumer

无法通过apache commons csv读取超过个记录

  •  1
  • AConsumer  · 技术社区  · 6 年前

    我有这样的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
    }
    

    以下代码给出 空指针异常 . 当我运行调试器时,我发现在第一次迭代中,ApacheSvcCommons是 能够读取第一条记录 csv文件的 给出空指针异常的第二次迭代。

    我不知道我做错了什么!.

    2 回复  |  直到 6 年前
        1
  •  2
  •   rodridevops    6 年前

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

    • 您正在使用enhaced for loop,这意味着第二个记录已经存在,这不是您的问题。
    • 这个 CSVInputFileModel 似乎是对的。
    • 您声明了inputcsvdata,但没有实例化。

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

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

        2
  •  2
  •   Sanjay    6 年前

    我已经使用了您的代码并进行了必要的更改,而且运行良好。

    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());
        }
    }
    

    }