Не в состоянии читать больше, чем запись через Apache Commons CSV - PullRequest
0 голосов
/ 06 января 2019

У меня есть 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.

Я сделал POJO, который соответствует вышеупомянутому CSV-файлу, и это с именем класса 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, тогда как это вторая итерация, которая дает исключение нулевого указателя.

Я не могу понять, что я сделал неправильно!

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Я использовал ваш код с необходимыми изменениями, и он работает нормально.

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

}

0 голосов
/ 06 января 2019

Во-первых, я уверен, что вы успешно читаете первую запись, но это невозможно, что можно добавить в список, поэтому:

  • Вы используете Enhaced for loop, что означает наличие второй записи, и это не ваша проблема.
  • Кажется, CSVInputFileModel прав.
  • Вы объявили inputCSVData, но не созданы.

мой вывод: вы пропустили экземпляр списка ввода, поэтому входите в первую итерацию, но не во вторую.

для решения этой проблемы поставьте inputCSVData = new ArrayList<CSVInputFileModel>(), прежде чем пытаться добавить элементы в свой код, чтобы исправить это.

...