一、简介
本文讲述如何用java来写csv文件。 CSV的意思是逗号分隔符(Comma-Separated-Values),是不同系统之间传输数据的一种常见方式。
要想写csv文件需要用到java.io 包。本文将讲述如何处理特殊字符。我们的目标是写出Microsoft Excel和google sheets可以读取的csv文件。
给出java例子后,我们还将给出一些好用的第三方库。
二、利用PrintWriter
2.1. 写 CSV
我们写一个方法,讲传入的字符串数组转成逗号分隔符的字符串:
1. public String convertToCSV(String[] data) { 2. return Stream.of(data) 3. .map(this::escapeSpecialCharacters) 4. .collect(Collectors.joining(",")); 5. }
调用这个方法之前,我们先造下数据
1. List<String[]> dataLines = new ArrayList<>(); 2. dataLines.add(new String[] 3. { "John", "Doe", "38", "Comment Data\nAnother line of comment data" }); 4. dataLines.add(new String[] 5. { "Jane", "Doe, Jr.", "19", "She said \"I'm being quoted\"" });
调用方法写出到文件
1. public void givenDataArray_whenConvertToCSV_thenOutputCreated() throws IOException { 2. File csvOutputFile = new File(CSV_FILE_NAME); 3. try (PrintWriter pw = new PrintWriter(csvOutputFile)) { 4. dataLines.stream() 5. .map(this::convertToCSV) 6. .forEach(pw::println); 7. } 8. assertTrue(csvOutputFile.exists()); 9. }
2.2. 处理特殊字符
我们重点处理逗号,引号和换行符。包含逗号和引号的字符将包上双引号,而双引号也会被用双引号转义。我们用空格来替换换行符。
1. public String escapeSpecialCharacters(String data) { 2. String escapedData = data.replaceAll("\\R", " "); 3. if (data.contains(",") || data.contains("\"") || data.contains("'")) { 4. data = data.replace("\"", "\"\""); 5. escapedData = "\"" + data + "\""; 6. } 7. return escapedData; 8. }
3. 第三方库
从上面的例子可以看出,写CSV文件最头痛的就是处理特殊字符。下面有几个非常不错的第三方库:
- Apache Commons CSV: Apache的CSV 文件的类库。
- Open CSV: 另外一个经常维护的CSV类库
- Flatpack: 一个经常维护的CSV类库
- CSVeed:一个经常维护的CSV类库
4. 结论
本文演示如何用PrintWriter写CSV文件。然后讨论了如何处理特殊字符。给出示例代码之后介绍了常用的第三方类库。
英文原文:https://www.baeldung.com/java-csv
源码:https://github.com/eugenp/tutorials/tree/master/core-java-io
如果觉得本文对你有帮助,欢迎点赞评论,欢迎关注我,我将努力创作更多更好的文章。