如何在 CSV 文件中转义逗号和语音符号,使它们能够在 Excel 中工作?

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

据我所知,一直都是这么做的。这是我的困惑: 当我在 Excel2010中打开这个文件时,我的转义是不受尊重的。语音标记将出现在工作表上,逗号将导致新列。

118447 次浏览

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

只有在列值前面没有空格时,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."

... 解决了问题,希望这能帮到别人!

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

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

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

  3. 如果值不包含逗号、换行符或双引号,则 字符串值应该保持不变地返回。

根据 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;

即使在双引号之后,我还是有这个问题好几天。

用逗号代替管道分隔符,然后一切工作正常。

单引号也可以很好地工作,即使没有避免双引号,至少在 Excel2016中是这样:

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

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