问题

我正在生成一个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."

据我所知,这一直都是这样做的。这是我的boggle:当我在Excel 2010中打开此文件时,我的转义不受尊重。语音标记显示在工作表上,逗号导致新列。


#1 热门回答(192 赞)

我们最终找到了答案。

如果列值前面没有空格,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 热门回答(52 赞)

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

  • 如果值包含逗号,换行符或双引号,则应以双引号括起来返回String值。
  • 值中的任何双引号字符都应使用另一个双引号进行转义。
  • 如果该值不包含逗号,换行符或双引号,则应返回String值不变。

#3 热门回答(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;

原文链接