Java写CSV文件的正确姿势

 

一、简介

本文讲述如何用java来写csv文件。 CSV的意思是逗号分隔符(Comma-Separated-Values),是不同系统之间传输数据的一种常见方式。

要想写csv文件需要用到java.io 包。本文将讲述如何处理特殊字符。我们的目标是写出Microsoft Excel和google sheets可以读取的csv文件。

给出java例子后,我们还将给出一些好用的第三方库。

二、利用PrintWriter

2.1. 写 CSV

我们写一个方法,讲传入的字符串数组转成逗号分隔符的字符串:

public String convertToCSV(String[] data) {
    return Stream.of(data)
      .map(this::escapeSpecialCharacters)
      .collect(Collectors.joining(","));
}

调用这个方法之前,我们先造下数据

List dataLines = new ArrayList<>();
dataLines.add(new String[] 
  { "John", "Doe", "38", "Comment Data\nAnother line of comment data" });
dataLines.add(new String[] 
  { "Jane", "Doe, Jr.", "19", "She said \"I'm being quoted\"" });

调用方法写出到文件

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. 处理特殊字符

我们重点处理逗号,引号和换行符。包含逗号和引号的字符将包上双引号,而双引号也会被用双引号转义。我们用空格来替换换行符。

public String escapeSpecialCharacters(String data) {
    String escapedData = data.replaceAll("\\R", " ");
    if (data.contains(",") || data.contains("\"") || data.contains("'")) {
        data = data.replace("\"", "\"\"");
        escapedData = "\"" + data + "\"";
    }
    return escapedData;
}

 

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

如果觉得本文对你有帮助,欢迎点赞评论,欢迎关注我,我将努力创作更多更好的文章。

你可能感兴趣的:(Java基础,翻译,工具使用)