Есть ли способ пропустить заголовок при использовании CsvBeanReader? - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть проект, в котором я должен записать объект в файл CSV. В настоящее время я использую для этого ICsvBeanWriter, но каждый раз, когда передается новая запись, она также записывает заголовок. Это создает проблемы при чтении из файла.

Ниже приведены методы для чтения и записи соответственно:

    public static ArrayList<communication> readCSV() throws IOException {
    ArrayList<communication> fileText = new ArrayList<>();
    ICsvBeanReader beanReader = new CsvBeanReader(new FileReader("products.csv"), CsvPreference.STANDARD_PREFERENCE);
    String[] header = beanReader.getHeader(true);
    CellProcessor[] processors = new CellProcessor[]{
            new ParseDouble(), // Distance
            new ParseDouble(), // Efficiency
            new ParseDouble(),// fuel
            new ParseDouble(),// total
    };
    communication com;
        while ((com = beanReader.read(communication.class, header, processors)) != null) {
                fileText.addAll(Collections.singletonList(com));
        }
    return fileText;
}

public static void writeCSV(double tripDistance, double fuelEfficiency, double costOfFuel, double totalCost) throws Exception {

    // create a list of employee
    List<communication> EmployeeList = new ArrayList<>();
    EmployeeList.add(new communication(tripDistance, fuelEfficiency, costOfFuel, (Math.round(totalCost * 100.0) / 100.0)));

    ICsvBeanWriter beanWriter = new CsvBeanWriter(new FileWriter("products.csv",true),
            CsvPreference.STANDARD_PREFERENCE);

    String[] header = new String[]{"TripDistance", "FuelEfficiency", "FuelCost", "Total"};

    beanWriter.writeHeader(header);
    CellProcessor[] processors = new CellProcessor[]{
            new ParseDouble(), // Distance
            new ParseDouble(), // Efficiency
            new ParseDouble(),// fuel
            new ParseDouble(),// total

    };

    for (communication com : EmployeeList) {
        beanWriter.write(com, header, processors);
    }
    beanWriter.close();
}

Я бы хотел, чтобы он либо пропускал запись или чтение заголовка, либо создавал метод, который удаляет все строки заголовка (пропуская 1-ую строку).

Это ошибка, которая появляется:

org.supercsv.exception.SuperCsvCellProcessorException: 'TripDistance' could not be parsed as a Double
processor=org.supercsv.cellprocessor.ParseDouble

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Эти строки кода создают заголовок:

String[] header = new String[]{"TripDistance", "FuelEfficiency", "FuelCost", "Total"};
beanWriter.writeHeader(header);

Я думаю, вы можете просто удалить их из своего кода.

0 голосов
/ 02 апреля 2020

Прежде всего, вы пометили это с помощью opencsv, но вы, кажется, на самом деле используете supercsv на основе имен классов в вашем коде. Этот ответ основан на этом наблюдении.

Два способа пропустить заголовок при чтении.

Вариант 1: класс читателя имеет метод getHeader (), который в соответствии с документацией может выполнять эту работу .

https://super-csv.github.io/super-csv/apidocs/org/supercsv/io/AbstractCsvReader.html#getHeader -boolean-

Опция 2. Первый параметр, передаваемый в CsvBeanReader, - это программа чтения, которая должна доставлять данные.

Так что, если вы хотите пропустить заголовок, вы можете передать его читателю, который уже сделал это. BufferedReader имеет удобный способ чтения строки, поэтому вы можете отказаться от первой. Это при условии, что CSV правильно отформатирован без пустых строк вверху.

BufferedReader br = new BufferedReader(new FileReader("products.csv"));
br.readLine(); // discard header

ICsvBeanReader beanReader = new CsvBeanReader(br, CsvPreference.STANDARD_PREFERENCE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...