如何使用Apache Common CSV CSVPrinter追加新行?

时间:2019-05-08 06:07:04

标签: java apache-commons-csv

我有此类包含使用 Apache Common CSV library 1.5

生成CSV文件的方法

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上。

谢谢。

2 个答案:

答案 0 :(得分:1)

使用APPEND选项:

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

您必须进行设置,以使以下 一个 为真:

  1. 开始之前,请确保输出文件为空或不存在; OR
  2. 仅在第二次及以后对APPEND的调用中使用generateCSV选项

顺便说一句,您要在对BufferedWriter的每次调用中创建一个新的CSVPrintergenerateCSV,而不要关闭任何一个。这很浪费,您可能应该在构造函数中创建它们,实现Closeable,并实现close()方法进行清理。然后,将调用代码包装在实例化generateCSV的try-with-resources中。

答案 1 :(得分:0)

检查https://stackoverflow.com/a/56034569/3602015中的条件后的解决方案

    String data = "stackoverflow";
    File file = new File("tmp/sample.csv");
    BufferedWriter writer;
    CSVPrinter csvPrinter;
    if (!file.exists()) {
        writer = Files.newBufferedWriter(Paths.get("tmp/sample.csv"));
        csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT.withHeader("S No","Col1"));
    } else {
        writer = Files.newBufferedWriter(Paths.get("tmp/sample.csv", StandardOpenOption.APPEND
                , StandardOpenOption.CREATE);
        csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT);
    }

    csvPrinter.printRecord("1", data);
    csvPrinter.flush();