1. 概述
在本快速教程中,我们将学习如何使用Java写入CSV文件。CSV代表逗号分隔值,它是系统之间批量数据传输的通用格式。
为了写入CSV文件,我们将使用java.io包中的类。
我们将讨论特殊字符以及如何处理它们,我们的目标是在Microsoft Excel和Google Sheets中打开我们的输出文件。
在我们的Java示例之后,我们将简要介绍一些用于处理CSV文件的可用第三方库。
2. PrintWriter
我们将使用PrintWriter来写入我们的CSV文件,有关使用java.io写入文件的更详细信息,请参阅我们关于写入文件的文章。
2.1 写入CSV
首先,让我们创建一个方法来格式化表示为String数组的单行数据:
public String convertToCSV(String[] data) {
return Stream.of(data)
.map(this::escapeSpecialCharacters)
.collect(Collectors.joining(","));
}
在调用此方法之前,让我们先构建一些示例数据:
List<String[]> dataLines = new ArrayList<>();
dataLines.add(new String[] { "John", "Doe", "38", "Comment DatanAnother line of comment data" });
dataLines.add(new String[] { "Jane", "Doe, Jr.", "19", "She said "I'm being quoted"" });
有了这些数据,让我们用convertToCSV转换每一行,并将其写入文件:
public void givenDataArray_whenConvertToCSV_thenOutputCreated() throws IOException {
File csvOutputFile = new File(CSV_FILE_NAME);
try (PrintWriter pw = new PrintWriter(csvOutputFile)) {
dataLines.stream()
.map(this::convertToCSV)
.forEach(pw::println);
}
assertTrue(csvOutputFile.exists());
}
2.2 处理特殊字符
在CSV文件中,某些字符是有问题的,作为开发人员,我们很少能完全控制数据的质量,那么现在让我们看看如何处理特殊字符。
对于我们的示例,我们将重点关注逗号、引号和换行符。包含逗号或引号的字段会被双引号包围,而双引号会被双引号转义。我们将删除换行符,并将其分别替换为空格。
有问题的字符及其处理方式可能因用例而异。
我们的convertToCSV方法在构建字符串时对每条数据调用escapeSpecialCharacters方法。
现在让我们实现escapeSpecialCharacters方法:
public String escapeSpecialCharacters(String data) {
if (data == null) {
throw new IllegalArgumentException("Input data cannot be null");
}
String escapedData = data.replaceAll("\\R", " ");
if (escapedData.contains(",") || escapedData.contains("\"") || escapedData.contains("'")) {
escapedData = escapedData.replace("\"", "\"\"");
escapedData = "\"" + escapedData + "\"";
}
return escapedData;
}
3. 第三方库
正如我们在示例中看到的那样,当我们开始考虑特殊字符以及如何处理它们时,写入CSV文件会变得很复杂。
幸运的是,有许多第三方库可用于处理CSV文件,其中许多库可以处理这些特殊字符和可能出现的其他特殊情况。
让我们来看看其中的几个:
- Apache Commons CSV:Apache的CSV产品,用于处理CSV文件
- Open CSV:另一个流行且积极维护的CSV库
- Flatpack:一个正在积极开发的开源CSV库
- CSVeed:开源且积极维护
- FastCSV:高性能开源库
4. 总结
在这篇简短的文章中,我们讨论了如何使用Java的PrintWriter类写入CSV文件。接下来,我们讨论并处理了输出数据中的特殊字符。
在我们的简单Java示例之后,我们查看了可用的第三方库的概述。
Post Directory
