Java 如何在CSV文件中转义逗号和语音标记,以便它们在Excel中工作?

Java 如何在CSV文件中转义逗号和语音标记,以便它们在Excel中工作?,java,excel,csv,special-characters,Java,Excel,Csv,Special Characters,我正在生成一个CSV文件(由逗号而不是制表符分隔)。我的用户很可能通过双击在Excel中打开CSV文件。我的数据可能包含逗号和语音标记,因此我将按如下方式进行转义 Reference, Title, Description 1, "My little title", "My description, which may contain ""speech marks"" and commas." 2, "My other little title", "My other description,

我正在生成一个CSV文件(由逗号而不是制表符分隔)。我的用户很可能通过双击在Excel中打开CSV文件。我的数据可能包含逗号和语音标记,因此我将按如下方式进行转义

Reference, Title, Description
1, "My little title", "My description, which may contain ""speech marks"" and commas."
2, "My other little title", "My other description, which may also contain ""speech marks"" and commas."

据我所知,这一直是做这件事的方法。这是我的困惑:当我在Excel 2010中打开此文件时,我的转义不受尊重。语音标记出现在工作表上,逗号会产生新的列。

我们最终找到了答案

如果列值前面没有空格,Excel将只考虑逗号和语音标记的转义。因此,生成没有空格的文件时,如下所示

Reference,Title,Description
1,"My little title","My description, which may contain ""speech marks"" and commas."
2,"My other little title","My other description, which may also contain ""speech marks"" and commas."

。。。解决了这个问题。希望这对别人有帮助

如果你认为这是随机的,下面是规则。可以根据这些规则创建效用函数

  • 如果值包含逗号、换行符或双引号,则返回的字符串值应包含在双引号中

  • 值中的任何双引号字符都应使用另一个双引号转义

  • 如果该值不包含逗号、换行符或双引号,则 字符串值应原封不动地返回


  • 根据Yashu的说明,我编写了以下函数(它是PL/SQL代码,但应该很容易适应任何其他语言)

    函数字段(VARCHAR2中的str)返回VARCHAR2为
    C_换行符常量字符(1):='
    '; -- 新行是有意的
    瓦查尔2号(32000);
    v_有双引号;
    v_有_逗号布尔;
    v_具有新行布尔值;
    开始
    v_有双引号:=instr(str,“”)>0;
    v_有逗号:=instr(str,,')>0;
    v_有新行:=instr(str,C_新行)>0;
    如果v_有双引号或v_有逗号或v_有换行符,那么
    如果v_有双引号,那么
    v_aux:=替换(str,“,”);
    其他的
    v_aux:=str;
    如果结束;
    返回“| | v|u aux |””;
    其他的
    返回str;
    如果结束;
    结束;
    
    即使在双引号之后,我也有好几天出现这个问题


    将管道分隔符替换为逗号,然后一切正常。

    单引号也可以正常工作,即使不转义双引号,至少在Excel 2016中:

    'text with spaces, and a comma','more text with spaces','spaces and "quoted text" and more spaces','nospaces','NOSPACES1234'
    

    Excel将把它放在5列中(如果您在“文本到列”向导中选择单引号作为“文本限定符”)

    将没有逗号、双引号或换行符的内容括起来会有什么影响吗?不,ErikReppen,我不认为这会影响正常情况。我属于java背景,建议不要通过替换旧字符串中的文本来创建新字符串,因为它们在堆内存中有自己的共享。如果您愿意,您可以无条件地替换所有值,并告诉我们它是否会导致任何问题,尽管它不应该引起任何问题。应该引用以空格开头或结尾的字段。您应该提供一个适用于您的示例,以便OP可以在需要时复制和粘贴它。这是我以前遇到的问题,我总是忘记它。Excel应该停止这种行为,因为它只会造成混乱,而且从一开始就不是一个有用的规则。该或csv的逗号之间必须没有空格。