С OpenCSV, как я могу добавить к существующему CSV, используя MappingStrategy? - PullRequest
0 голосов
/ 04 марта 2019

С OpenCSV, как мне добавить к существующему CSV, используя MappingStrategy?Есть много примеров, которые я мог бы найти, где НЕ использовать состояние отображения бина, НО мне нравится динамическая природа отображения столбца со стратегией бина, и я хотел бы, чтобы он работал таким образом.Вот мой код, который просто переписывает одну строку в файл CSV вместо добавления.

Как я могу это исправить?Использование OpenCSV 4.5.Примечание: я установил свой FileWriter для append = true.Этот сценарий не работает, как я ожидал.Повторный запуск этого метода просто приводит к перезаписи всего файла заголовком и одной строкой.

public void addRowToCSV(PerfMetric rowData) {
    File file = new File(PerfTestMetric.CSV_FILE_PATH);
    try {
        CSVWriter writer = new CSVWriter(new FileWriter(file, true));

        CustomCSVMappingStrategy<PerfMetric> mappingStrategy 
          = new CustomCSVMappingStrategy<>();
        mappingStrategy.setType(PerfMetric.class);

        StatefulBeanToCsv<PerfMetric> beanToCsv 
           = new StatefulBeanToCsvBuilder<PerfMetric>(writer)
            .withMappingStrategy(mappingStrategy)
            .withSeparator(',')
            .withApplyQuotesToAll(false)
            .build();

        try {
            beanToCsv.write(rowData);
        } catch (CsvDataTypeMismatchException e) {
            e.printStackTrace();
        } catch (CsvRequiredFieldEmptyException e) {
            e.printStackTrace();
        }
        writer.flush();
        writer.close();
    } catch (IOException e) {
            e.printStackTrace();
    }
}

Или это обычный шаблон для загрузки всех строк в список, а затем перезаписи всегофайл?Я смог заставить его работать, написав две стратегии сопоставления MappingStrategy и затем условно используя их с if-file-существующие, но при таком способе я оставляю в своем коде предупреждение «Непроверенное назначение».Не идеально;надеетесь на элегантное решение?

1 Ответ

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

Я так и не нашел ответа на этот вопрос, и поэтому я закончил тем, что выполнил ветку if-условие, где файл .csv существует или нет.Если файл существует, я использовал стратегию MappingStrategyWithoutHeader , а если файл еще не существовал, я использовал стратегию MappingStrategyWithHeader .Не идеально, но у меня все получилось.

...