Как добавить новую строку, используя Apache Common CSV CSVPrinter? - PullRequest
1 голос
/ 08 мая 2019

У меня есть этот класс, содержащий метод для создания файла CSV с использованием Apache Common CSV library 1.5

public class CSVGenerator {

    private static final String CSV_FILE = "./credentials.csv";
    private static CSVPrinter csvPrinter;

    public static void generateCSV(String FirstName, String LastName, String DOB) {


        try {
            BufferedWriter writer = Files.newBufferedWriter(Paths.get(CSV_FILE) );

            csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT
                    .withHeader("FirstName", "LastName", "DOB"));

            csvPrinter.printRecord(FirstName, LastName, DOB);
            csvPrinter.flush();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

У меня есть метод в моем основном классе, этот метод будет вызывать метод generateCSV() пару раз.
Как я могу написать новую строку и добавить ее в существующий файл CSV? Используя мою текущую реализацию, она будет перезаписывать мою первую строку.

Более простым решением было бы собрать все мои данные в любой коллекции Java (массив или список), а затем в самом конце просто выполнить итерацию коллекции и записать ее в CSV за один раз. Но я бы не пошел по этому пути. Я предпочитаю записать одну строку в CSV, сделать что-то еще, затем снова вызвать метод, чтобы написать новую строку и добавить ее к существующему CSV.

Спасибо.

1 Ответ

1 голос
/ 08 мая 2019

Используйте параметр APPEND:

BufferedWriter writer = Files.newBufferedWriter(
        Paths.get(CSV_FILE), 
        StandardOpenOption.APPEND, 
        StandardOpenOption.CREATE);

Вы должны настроить все так, чтобы one из следующих условий:

  1. Прежде чем начать, убедитесь, что выходной файл пуст или отсутствует; ИЛИ
  2. Используйте опцию APPEND только при втором и последующих вызовах generateCSV

Кстати, вы создаетеновые BufferedWriter и CSVPrinter при каждом вызове generateCSV, и не закрытие ни одного.Это расточительно, вам, вероятно, следует создать их в конструкторе, реализовать Closeable и реализовать метод close() для очистки.Затем оберните вызывающий код в попытку с ресурсами, который создает экземпляр generateCSV.

...