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

时间:2012-05-04 15:31:36

标签: java regex excel oracle csv

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

不幸的是,数据内容可能非常棘手。仍然逗号是分隔符,但连续的一些数据可能是这样的:

  

ID FN LN 年龄 评论

     123,约翰,史密斯,39岁,我说“嘿,我是5'10”。“

所以这是comment列上的字符串之一:

  

我说“嘿,我是5'10”。“

不开玩笑,我需要在Excel中生成的CSV文件中在excel或open office中不妥协地显示上述评论,当然也不能搞乱其他常规转义情况(即常规双引号和元组中的常规逗号) 。我知道正则表达式很强大,但我们怎样才能在如此复杂的情况下实现目标呢?

7 个答案:

答案 0 :(得分:97)

有几个图书馆。以下是两个例子:


❐ 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"."
    

* 您可以从 here下载。


❐ 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();
    

* 您可以从 here下载。

答案 1 :(得分:34)

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"""

答案 2 :(得分:14)

感谢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+"\""

答案 3 :(得分:3)

您还可以查看Python writes Excel-compatible csv files.

的方式

我认为Excel的默认值是文字引号字符加倍 - 即文字引号"写为""

答案 4 :(得分:2)

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

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

重要提示

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

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

答案 5 :(得分:2)

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

.withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)

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

答案 6 :(得分:0)

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

这将保留CSV文件中的逗号