如何转义CSV文件中的逗号和语音标记,以便它们在Excel中工作?

kxxlusnw  于 2022-12-24  发布在  其他
关注(0)|答案(5)|浏览(145)

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

apeeds0o

apeeds0o1#

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

解决了这个问题。

xeufq47z

xeufq47z2#

如果你认为它是随机的,下面是一些规则。效用函数可以在这些规则的基础上创建。
1.如果该值包含逗号、换行符或双引号,则返回的String值应包含在双引号中。
1.值中的任何双引号字符都应使用另一个双引号进行转义。
1.如果该值不包含逗号、换行符或双引号,则String值应原样返回。

tcomlyy6

tcomlyy63#

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

hrirmatl4#

单引号也很好用,即使没有转义双引号,至少在Excel 2016中是这样:

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

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

yshpjwxd

yshpjwxd5#

即使在双引号之后,我也有这个问题好几天了。
将管道分隔符替换为逗号,然后一切正常。

相关问题