119

我正在生成一个 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 中打开此文件时,我的转义不受尊重。语音标记出现在工作表上,逗号导致新列。

4

5 回答 5

232

我们最终找到了这个问题的答案。

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

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

于 2012-09-18T08:50:36.623 回答
64

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

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

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

  3. 如果该值不包含逗号、换行符或双引号,则应原样返回 String 值。

于 2014-02-13T09:01:46.777 回答
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;
于 2015-05-26T14:17:16.230 回答
0

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

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

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

于 2018-06-12T10:19:09.403 回答
-3

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

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

于 2015-10-09T09:48:01.430 回答