我应该如何逃避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." 

据我所知,一直是这样做的。 这里是我的错误:当我在Excel 2010中打开此文件时,我的转义不受尊重。 语音标记出现在表单上,​​逗号导致新的列。

我们最终find了答案。

如果列值不在空格之前,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." 

解决问题 希望这可以帮助别人!

如果您认为这是随机的,那么以下是规则。 可以在这些规则的基础上创build一个效用函数。

  1. 如果该值包含逗号,换行符或双引号,则string值应以双引号括起来。

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

  3. 如果该值不包含逗号,换行符或双引号,则string值应该保持不变。

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

即使在双引号后,我也有这个问题几天。

用逗号replacepipe道分隔符,然后事情工作正常。