无法通过 Apache commons csv 读取更多记录
Not able to read more than record through 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 class.
下面是我用来读取文件的方法:-
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 class
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 文件的第一个记录 ,而它是 第二个给出空指针异常的迭代。
我不知道我做错了什么!
首先,我确定您正在成功读取第一条记录,但不可能将其添加到列表中,因此:
- 您正在使用增强型 for 循环,这意味着第二条记录已经存在,这不是您的问题。
CSVInputFileModel
好像是对的
- 您声明了 inputCSVData 但未实例化。
我的结论是您错过了输入列表实例,这就是进入第一次迭代但从未进入第二次迭代的原因。
要解决此问题,请先 inputCSVData = new ArrayList<CSVInputFileModel>()
尝试在代码中添加元素以修复它。
我已经使用了您的代码并进行了必要的更改,并且工作正常。
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());
}
}
}
我有这样的 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 class.
下面是我用来读取文件的方法:-
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 class
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 文件的第一个记录 ,而它是 第二个给出空指针异常的迭代。
我不知道我做错了什么!
首先,我确定您正在成功读取第一条记录,但不可能将其添加到列表中,因此:
- 您正在使用增强型 for 循环,这意味着第二条记录已经存在,这不是您的问题。
CSVInputFileModel
好像是对的- 您声明了 inputCSVData 但未实例化。
我的结论是您错过了输入列表实例,这就是进入第一次迭代但从未进入第二次迭代的原因。
要解决此问题,请先 inputCSVData = new ArrayList<CSVInputFileModel>()
尝试在代码中添加元素以修复它。
我已经使用了您的代码并进行了必要的更改,并且工作正常。
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());
}
}
}