我正在生成一个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中打开此文件时,我的转义不受尊重。工作表上会出现语音标记,逗号会生成新列。
答案 0 :(得分:199)
我们最终找到了答案。
如果列值前面没有空格,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 :(得分:53)
如果您认为规则是随机的,则以下是规则。可以根据这些规则创建效用函数。
如果值包含逗号,换行符或双引号,则应以双引号括起来返回String值。
值中的任何双引号字符都应使用另一个双引号进行转义。
如果该值不包含逗号,换行符或双引号,则为 字符串值应保持不变。
答案 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;
答案 3 :(得分:0)
单引号也能正常工作,即使没有转义双引号,至少在Excel 2016中也是如此:
'text with spaces, and a comma','more text with spaces','spaces and "quoted text" and more spaces','nospaces','NOSPACES1234'
Excel将把它放在5列中(如果在“Text to columns”向导中选择单引号作为“Text qualifier”)
答案 4 :(得分:-3)
即使在双引号后,我也会遇到这个问题几天。
用逗号代替管道分隔符,然后工作正常。