Java中如何在导出CSV时,同时使用单引号及双引号?

我正在编写一个 Java 应用程序以将数据从 Oracle 导出到 csv 文件

但行上的某些数据可能如下所示:
image.png

阅读 1.8k
avatarAI BotBETA

在Java中导出CSV时,同时使用单引号和双引号可能会导致解析问题,因为CSV格式通常使用双引号来引用包含特殊字符(如逗号、换行符等)的文本。如果你需要在CSV中同时使用单引号和双引号,一种解决方案是在内部使用单引号来引用包含特殊字符的文本,然后在外部使用双引号来引用整个单元格。

以下是一个示例代码片段,演示如何在Java中实现这种导出:

import java.io.*;
import java.nio.file.*;

public class ExportCSV {
    public static void main(String[] args) {
        String csvFile = "/path/to/your/file.csv";
        String line = "";
        String csvSplitBy = ",";
        try (BufferedWriter bw = Files.newBufferedWriter(Paths.get(csvFile))) {
            // 这里是示例数据,实际应用中,你需要从Oracle数据库或其他数据源获取数据
            String[][] data = {
                {"Name", "Email", "Phone"},
                {"John Doe", "john.doe@example.com", "1234567890"},
                {"Jane Doe", "jane.doe@example.com", "0987654321"}
            };
            for (String[] row : data) {
                for (int i = 0; i < row.length; i++) {
                    // 如果该单元格包含特殊字符(如双引号或逗号),则在内部使用单引号引用,在外部使用双引号引用
                    if (row[i].contains(",") || row[i].contains("\"")) {
                        row[i] = "\"" + row[i].replace(",", "\",\"").replace("\"", "\"\"") + "\"";
                    }
                }
                line += String.join(csvSplitBy, row) + "\n";
            }
            bw.write(line);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这段代码首先检查每个单元格是否包含特殊字符(如逗号或双引号)。如果单元格包含这些字符,它将使用单引号来包围该单元格的内容,然后在外部使用双引号来包围整个行。这样可以确保CSV文件正确解析。

2 个回答

CSV有相关的组件可以进行处理。但也有一个简单的做法,通过Excel组件可以免去CSV处理的相关细节。
只需要关注Java中如何转义双引号就行了。

public void ExportCSV() {
    Workbook wb = new Workbook();
    IWorksheet sheet = wb.getWorksheets().get(0);
    sheet.getRange("A1").setValue(123);
    sheet.getRange("B1").setValue("葡萄");
    sheet.getRange("C1").setValue("苹果");
    sheet.getRange("D1").setValue("ABC");
    sheet.getRange("E1").setValue("我说:\"你把'苹果'给我\"");

    wb.save("output/export.csv");
}

结果:
123,葡萄,苹果,ABC,"我说:""你把'苹果'给我"""
参考资料:https://demo.grapecity.com.cn/documents-api-excel-java/demos/...

可以使用opencsv来处理
通过maven添加

        <dependency>
            <groupId>org.ow2.util.bundles</groupId>
            <artifactId>opencsv-2.1</artifactId>
            <version>1.0.0</version>
        </dependency>

使用时通过构造CSVWriter来指定分隔符和转义符

    public CSVWriter(Writer writer, char separator, char quotechar, char escapechar, String lineEnd) {
        this.rawWriter = writer;
        this.pw = new PrintWriter(writer);
        this.separator = separator;
        this.quotechar = quotechar;
        this.escapechar = escapechar;
        this.lineEnd = lineEnd;
    }

可以指定特定的分隔符、引号符、转义符来避免你的单双引号混淆问题

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题