如何使用Apache Common CSV CSVPRINTER附加新行



我有一个类包含一种使用 apache common CSV库生成CSV文件的方法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上。

谢谢。

使用APPEND选项:

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

您必须设置内容,以便一个以下是正确的:

  1. 在开始之前,请确保输出文件为空或不存在;
  2. 仅在第二次且随后的呼叫generateCSV
  3. 中使用APPEND选项

顺便说一句,您正在每个呼叫generateCSV的呼叫中创建一个新的BufferedWriterCSVPrinter,而不会关闭任何一个。这是浪费的,您可能应该在构造函数中创建那些,实现Closeable并实现close()方法进行清理。然后将调用代码包装在实例化 generateCSV的try-with-Resources中。

这是一种更简单的方法。在检查文件存在之后,只有您应该在创建实例化文件时实例化作者对象,并且每次将file.exists((作为true。如果存在文件,则需要使用withskipheaderrecord((创建csvprinter(else(使用header((方法的任何实现。FileWriter构造函数使用文件参数进行附加参数。如果有文件,则必须将附加参数作为true。

File file = new File(filePath.concat("/").concat(fileName));
        if(file.exists()) {
            fileWriter = new FileWriter(file, true);
            csvPrinter = new CSVPrinter(fileWriter, CSVFormat.DEFAULT.withSkipHeaderRecord());
        }
        else {
            fileWriter = new FileWriter(file);
            csvPrinter = new CSVPrinter(fileWriter, CSVFormat.DEFAULT.withHeader("FirstName", "LastName", "DOB"));
            
        }

解决了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();

相关内容

  • 没有找到相关文章

最新更新