如何在CSV文件中转义逗号和引号以便在Excel中正常显示?

123

我正在生成一个逗号分隔的 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中打开此文件时,转义字符并未被正确处理。引号显示在工作表中,并且逗号会导致新列出现。
5个回答

240

如果列值前没有空格,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文件应该强制规定逗号之间不能有空格。 - Jacques Mathieu

66

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

  1. 如果值包含逗号、换行或双引号,则应返回用双引号括起来的字符串值。

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

  3. 如果值不包含逗号、换行符或双引号,则应返回未更改的字符串值。


5
引用包裹没有逗号、双引号或换行符的内容会对其造成任何伤害吗? - Erik Reppen
2
没有ErikReppen,我认为这通常不会有影响。我来自Java背景,建议不要通过替换旧字符串中的文本来创建新字符串,因为它们在堆内存中有自己的份额。如果您愿意,可以无条件地替换所有值,并告诉我们是否会引起任何问题,尽管它不应该。 - AlphaBetaGamma
4
以空格开头或结尾的字段应该用引号括起来。 - Jonathan Rosenne

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个列中。


-3

即使在双引号之后,我也遇到了这个问题几天。

将管道分隔符替换为逗号,然后事情就正常了。


2
你应该提供一个你所使用的有效示例,这样问题的提出者就可以在需要时复制粘贴它。 - Reuben Tanner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接