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


111

我正在生成一个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中打开此文件时,我的转义未得到遵守。工作表上会出现语音标记,并且逗号引起新的列。

Answers:


219

我们最终找到了答案。

如果列值前面没有空格,则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."

...解决了这个问题。希望这对某人有帮助!


2
这是我以前遇到的一个问题,我总是忘记了。Excel应该停止这种行为,因为它只会造成混乱,而不是一开始就没有帮助的规则。那个或csv的逗号之间必须没有空格。
雅克·马修

61

如果您认为随机性,请遵循以下规则。可以根据这些规则创建效用函数。

  1. 如果该值包含逗号,换行符或双引号,则应将String值括在双引号中。

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

  3. 如果该值不包含逗号,换行符或双引号,则String值应保持不变。


4
用引号将没有逗号,双引号或换行符的内容括起来会不会有任何伤害?
埃里克·雷彭

2
没有ErikReppen,我认为这不会正常伤害。我属于Java背景,在Java背景中,建议不要通过替换旧文本来创建新字符串,因为它们在堆内存中具有自己的份额。如果需要,您可以无条件替换所有值,并告诉我们是否会导致任何问题,尽管不是这样。
AlphaBetaGamma 2015年

2
以空格开头或结尾的字段应加引号。
乔纳森·罗森

2

根据Yashu的指示,我编写了以下函数(它是PL / SQL代码,但应该易于适应任何其他语言)。

FUNCTION field(str IN VARCHAR2) RETURN VARCHAR2 IS
    C_NEWLINE CONSTANT CHAR(1) := '
'; -- newline is intentional

    v_aux VARCHAR2(32000);
    v_has_double_quotes BOOLEAN;
    v_has_comma BOOLEAN;
    v_has_newline BOOLEAN;
BEGIN
    v_has_double_quotes := instr(str, '"') > 0;
    v_has_comma := instr(str,',') > 0;
    v_has_newline := instr(str, C_NEWLINE) > 0;

    IF v_has_double_quotes OR v_has_comma OR v_has_newline THEN
        IF v_has_double_quotes THEN
            v_aux := replace(str,'"','""');
        ELSE
            v_aux := str;
        END IF;
        return '"'||v_aux||'"';
    ELSE
        return str;
    END IF;
END;

0

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

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.