如何使用 Apache Common CSV CSVPrinter 添加新行?
How to append new row using Apache Common CSV CSVPrinter?
我有这个 class 包含使用 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();
}
}
}
我的 main class 中有一个方法,这个方法会调用方法 generateCSV()
几次。
如何写入新行并将其附加到现有的 CSV 文件中?使用我当前的实现,它将继续覆盖我的第一行。
更直接的解决方案是在任何 Java 集合(数组或列表)中收集我的所有数据,然后在最后迭代集合并将其一次性写入 CSV。但我不会那样做。我更喜欢将一行写入 CSV ,然后执行其他操作,然后再次调用该方法以写入新行并将其附加到现有 CSV 中。
谢谢。
使用APPEND
选项:
BufferedWriter writer = Files.newBufferedWriter(
Paths.get(CSV_FILE),
StandardOpenOption.APPEND,
StandardOpenOption.CREATE);
您必须进行设置,以便 其中一个 为真:
- 开始之前,请确保输出文件为空或non-existent; 或
- 仅在第二次和后续调用
generateCSV
时使用 APPEND
选项
顺便说一句,您在每次调用 generateCSV
时都会创建一个新的 BufferedWriter
和 CSVPrinter
,并且不会关闭任何一个。这很浪费,您可能应该在构造函数中创建它们,实现 Closeable
,并实现一个 close()
方法来清理。然后将调用代码包装在实例化 generateCSV
.
的 try-with-resources 中
根据
中的条件检查后的解决方案
String data = "Whosebug";
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();
这是一种更简单的方法。在检查文件是否存在之后,您应该实例化 Writer 对象,否则实例化文件将被创建,并且每次您都会将 file.exists() 设置为 true。
如果文件存在,您需要使用 withSkipHeaderRecord() 创建 CSVPrinter,否则使用 header() 方法的任何实现。 FileWriter 构造函数采用带有 File 参数的附加参数。如果文件在那里,您必须将附加参数设置为 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"));
}
我有这个 class 包含使用 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();
}
}
}
我的 main class 中有一个方法,这个方法会调用方法 generateCSV()
几次。
如何写入新行并将其附加到现有的 CSV 文件中?使用我当前的实现,它将继续覆盖我的第一行。
更直接的解决方案是在任何 Java 集合(数组或列表)中收集我的所有数据,然后在最后迭代集合并将其一次性写入 CSV。但我不会那样做。我更喜欢将一行写入 CSV ,然后执行其他操作,然后再次调用该方法以写入新行并将其附加到现有 CSV 中。
谢谢。
使用APPEND
选项:
BufferedWriter writer = Files.newBufferedWriter(
Paths.get(CSV_FILE),
StandardOpenOption.APPEND,
StandardOpenOption.CREATE);
您必须进行设置,以便 其中一个 为真:
- 开始之前,请确保输出文件为空或non-existent; 或
- 仅在第二次和后续调用
generateCSV
时使用
APPEND
选项
顺便说一句,您在每次调用 generateCSV
时都会创建一个新的 BufferedWriter
和 CSVPrinter
,并且不会关闭任何一个。这很浪费,您可能应该在构造函数中创建它们,实现 Closeable
,并实现一个 close()
方法来清理。然后将调用代码包装在实例化 generateCSV
.
根据
String data = "Whosebug";
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();
这是一种更简单的方法。在检查文件是否存在之后,您应该实例化 Writer 对象,否则实例化文件将被创建,并且每次您都会将 file.exists() 设置为 true。 如果文件存在,您需要使用 withSkipHeaderRecord() 创建 CSVPrinter,否则使用 header() 方法的任何实现。 FileWriter 构造函数采用带有 File 参数的附加参数。如果文件在那里,您必须将附加参数设置为 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"));
}