OpenCSV все хранение данных в однострочной версии (5.1) и потеря данных - PullRequest
2 голосов
/ 30 апреля 2020

При сохранении объекта с помощью 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());
            }
        }
    }

1 Ответ

2 голосов
/ 30 апреля 2020

Когда вы пытаетесь написать более одного объекта, последний перезаписывается, потому что FileWriter, который вы передаете StatefulBeanToCsv, не находится в режиме добавления. Вы должны указать режим добавления в конструкторе FileWriter.

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

Редактировать: Это должно решить заголовки нескольких столбцов и заголовок столбца без прерывания строки. Это работает для меня.

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"
...