首页 文章

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

提问于
浏览
60

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

不幸的是,数据的内容可能非常棘手 . 仍然逗号是deliminator,但行上的一些数据可能是这样的:

ID FN LN AGE评论123,约翰,史密斯,39岁,我说“嘿,我是5'10” . “

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

我说“嘿,我5'10” . “

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

6 回答

  • 3
    "cell one","cell "" two","cell "" ,three"
    

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

    Important Note

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

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

  • 12

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

  • 0

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

    你也可以看看如何Python writes Excel-compatible csv files.

    我相信Excel的默认值是文字引号字符加倍 - 也就是说,字面引号 " 被写为 "" .

  • 2

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


    ❐ApacheCommons 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中取消
    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,则无需担心转义或unescape,仅用于写入或读取内容 .

    • 写文件:
    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();
    
    • 你可以在这里下载 .
  • 94
    String stringWithQuates = "\""+ "your,comma,separated,string" + "\"";
    

    这将保留CSV文件中的逗号

相关问题