提问者:小点点

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


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

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

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

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

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

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


共3个答案

匿名用户

有几个库。这里有两个例子:

Apache Commons Long包含一个特殊的类来转义或取消转义字符串(CSV、EcmaScript、超文本标记语言、Java、Json、XML):org. apache.通用.lang3.StringEscape eUtils

>

  • 逃到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,则无需担心转义或无法转义,仅用于写入或读取内容。

    >

  • 写入文件:

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

    匿名用户

    感谢托尼和保罗的快速反馈,这非常有帮助。我实际上通过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 "\""