使用OpenCSV,如何使用MappingStrategy附加到现有CSV?

问题描述 投票:0回答:1

使用OpenCSV,如何使用MappingStrategy附加到现有CSV?我可以找到很多不使用Bean映射策略的例子但是我喜欢使用bean策略的列映射的动态特性,并希望以这种方式工作。这是我的代码,它只是将单行重写为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();
    }
}

或者,是将所有行加载到List然后重写整个文件的常用模式?我能够通过编写两个MappingStrategy映射策略然后有条件地使用if-file-exists来使它工作,但这样做会让我在代码中留下“未经检查的赋值”警告。不理想;希望有一个优雅的解决方案?

opencsv
1个回答
0
投票

我从来没有找到这个问题的答案,所以我最终做的是做一个分支if条件,其中存在.csv文件。如果文件存在,我使用MappingStrategyWithoutHeader策略,如果文件尚不存在,我使用MappingStrategyWithHeader策略。不理想,但我得到了它的工作。

© www.soinside.com 2019 - 2024. All rights reserved.