繁体   English   中英

如何同时转义 CSV 文件的逗号和双引号?

[英]How to escape comma and double quote at same time for CSV file?

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

不幸的是,数据的内容可能相当棘手。 逗号仍然是分隔符,但是一行中的一些数据可能是这样的:

| ID    |   FN    |   LN   |  AGE   |  COMMENT                   |
|----------------------------------------------------------------|
| 123   |  John   |  Smith |   39   | I said "Hey, I am 5'10"."  |
|----------------------------------------------------------------|

所以这是comment栏中的字符串之一:

我说“嘿,我是 5 英尺 10 英寸”。

不开玩笑,我需要在 excel 中毫不妥协地显示上述评论,或者从 Java 生成的 CSV 文件打开办公室,当然不能搞乱其他常规 escaping 情况(即常规双引号和元组中的常规逗号)。 我知道正则表达式很强大,但我们如何在如此复杂的情况下实现目标呢?

有几个图书馆。 这里有两个例子:


❐ Apache Commons Lang

Apache Commons Lang包含一个特殊的类来转义或取消转义字符串(CSV、EcmaScript、HTML、Java、Json、XML): org.apache.commons.lang3.StringEscapeUtils

  • 转义为 CSV

     String escaped = StringEscapeUtils .escapeCsv("I said \\"Hey, I am 5'10\\".\\""); // I said "Hey, I am 5'10"." System.out.println(escaped); // "I said ""Hey, I am 5'10""."""
  • 从CSV UNESCAPE

     String unescaped = StringEscapeUtils .unescapeCsv("\\"I said \\"\\"Hey, I am 5'10\\"\\".\\"\\"\\""); // "I said ""Hey, I am 5'10"".""" System.out.println(unescaped); // I said "Hey, I am 5'10"."

*你可以从这里下载


❐ OpenCSV

如果您使用OpenCSV ,则无需担心转义或转义,只需写入或读取内容。

  • 写入文件:

     FileOutputStream fos = new FileOutputStream("awesomefile.csv"); OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); CSVWriter writer = new CSVWriter(osw); ... String[] row = { "123", "John", "Smith", "39", "I said \\"Hey, I am 5'10\\".\\"" }; writer.writeNext(row); ... writer.close(); osw.close(); os.close();
  • 读取文件:

     FileInputStream fis = new FileInputStream("awesomefile.csv"); InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); CSVReader reader = new CSVReader(isr); for (String[] row; (row = reader.readNext()) != null;) { System.out.println(Arrays.toString(row)); } reader.close(); isr.close(); fis.close();

*你可以从这里下载

Excel 必须能够处理完全相同的情况。

将这些东西放入 Excel,将它们另存为 CSV,然后使用文本编辑器检查该文件。 然后你就会知道 Excel 应用于这些情况的规则。

使 Java 产生相同的输出。

顺便说一下,Excel 使用的格式已发布...

****编辑 1:**** 以下是 Excel 的作用
****编辑 2:**** 请注意,如果您使用 " 作为附件,php 的fputcsv与 excel 完全相同。

rdeslonde@mydomain.com
Richard
"This is what I think"

变成这样:

Email,Fname,Quoted  
rdeslonde@mydomain.com,Richard,"""This is what I think"""

感谢 Tony 和 Paul 的快速反馈,非常有帮助。 我实际上通过 POJO 找到了解决方案。 这里是:

if (cell_value.indexOf("\"") != -1 || cell_value.indexOf(",") != -1) {
    cell_value = cell_value.replaceAll("\"", "\"\"");
    row.append("\"");
    row.append(cell_value);
    row.append("\"");
} else {
    row.append(cell_value);
}

总之,如果有像串内逗号或双引号中侧的小区,则第一逃脱双引号(特殊字符"\\""通过添加额外的双引号(像) "\\"\\"" ),然后把整个事情变成双引号(如"\\""+theWholeThing+"\\""

您还可以查看Python如何编写与 Excel 兼容的csv文件。

我相信 Excel 的默认设置是将文字引号字符加倍 - 也就是说,文字引号"写为""

如果您使用的是 CSVWriter。 检查您是否没有该选项

.withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)

当我删除它时,逗号按预期显示,而不是将其视为新列

"cell one","cell "" two","cell "" ,three"

将此保存到csv文件并查看结果,因此使用双引号进行转义

重要的提示

"cell one","cell "" two", "cell "" ,three"

会给你一个不同的结果,因为逗号后面有一个空格,这将被视为“

在 openCSV 中,使用以下方法创建 csvWriter obj,

CSVWriter csvWriter = new CSVWriter(writer, CSVWriter.DEFAULT_SEPARATOR, CSVWriter.DEFAULT_ESCAPE_CHARACTER, CSVWriter.DEFAULT_LINE_END, CSVWriter.DEFAULT_QUOTE_CHARACTER); 

其中, DEFAULT_QUOTE_CHARACTER非常重要。 如果您想在 csv 文件中插入任何 ',' 或 '"',它将完美运行。

String stringWithQuates = "\""+ "your,comma,separated,string" + "\"";

这将保留 CSV 文件中的逗号

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM