OpenCSV所有数据存储在单行版本(5.1)和数据丢失

OpenCSV all of the data storing in single line version (5.1) and data loss

您好,在使用 openCsv 保存对象时,数据存储在一行中,如果我尝试添加多个对象,则前一个对象的数据将被删除。如果有人知道解决方案,请在这里回答。

public final Logger log=Logger.getLogger("Error");
    public void beanToCsvExport(final T object, final String filePath) {
        if(object == null) {
            log.warning("Initialization of object failed");
        }else {
            try {
                Writer writer = new FileWriter(filePath);
                StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer).build();
                beanToCsv.write(object);
                writer.close();
            } catch (IOException e) {
                System.out.println(e.getMessage());
            } catch (CsvDataTypeMismatchException e) {
                System.out.println(e.getMessage());
            } catch (CsvRequiredFieldEmptyException e) {
                System.out.println(e.getMessage());
            }
        }
    }

当您尝试写入多个 object 时,最后一个被覆盖,因为您传递给 StatefulBeanToCsv 的 FileWriter 未处于追加模式。您应该在 FileWriter 构造函数中指定追加模式。

Writer writer = new FileWriter(filePath, true);
StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer).build();
beanToCsv.write(object);
writer.close();

编辑:这应该解决多列 header 和列 header 不断行的问题。它对我有用。

public <T> void beanToCsvExport(final List<T> object, final String filePath) {
    if (object == null) {
        System.out.println("Initialization of object failed");
    } else {
        try {
            cleanFile(filePath);
            FileWriter writer = new FileWriter(filePath, true);
            StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer).build();
            beanToCsv.write(object);
            writer.close();
        } catch (IOException | CsvDataTypeMismatchException | CsvRequiredFieldEmptyException e) {
            System.out.println(e.getMessage());
        }
    }
}

重置文件的函数:

public void cleanFile(String path) throws IOException {
    FileWriter writer = new FileWriter(path); //Open as non-append to delete all data.
    writer.write("");
    writer.close();
}

测试功能:

public void employeesToCsv() {
    List<Employee> list = Arrays.asList(new Employee("101", "sunny"), new Employee("102", "Andrew"));
    beanToCsvExport(list, "file.csv");
}

实现的输出:

"eId","eName"
"101","sunny"
"102","Andrew"