我正在编写一个 Java 应用程序以将数据从 Oracle 导出到 csv 文件
但行上的某些数据可能如下所示:
在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文件正确解析。
可以使用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;
}
可以指定特定的分隔符、引号符、转义符来避免你的单双引号混淆问题
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答4k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
CSV有相关的组件可以进行处理。但也有一个简单的做法,通过Excel组件可以免去CSV处理的相关细节。
只需要关注Java中如何转义双引号就行了。
结果:
123,葡萄,苹果,ABC,"我说:""你把'苹果'给我"""
参考资料:https://demo.grapecity.com.cn/documents-api-excel-java/demos/...