【问题标题】:How should I escape commas and speech marks in CSV files so they work in Excel?我应该如何转义 CSV 文件中的逗号和语音标记,以便它们在 Excel 中工作?
【发布时间】:2012-09-10 12:12:36
【问题描述】:

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

【问题讨论】:

    标签: java excel csv special-characters


    【解决方案1】:

    我们最终找到了答案。

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

    ... 解决了这个问题。希望这对某人有帮助!

    【讨论】:

    • 这是我之前遇到的一个问题,我总是忘记它。 Excel 应该停止这种行为,因为它只会造成混乱,而且从一开始就不是一个有用的规则。该或 csv 应该在逗号之间强制没有空格。
    【解决方案2】:

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

    1. 如果值包含逗号、换行符或双引号,则返回的字符串值应用双引号括起来。

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

    3. 如果值不包含逗号、换行符或双引号,则 字符串值应原样返回。

    【讨论】:

    • 引用-换行没有逗号、双引号或换行符的内容有什么害处吗?
    • No ErikReppen 我不认为这会伤害正常。我属于 java 背景,它建议不要通过替换旧字符串中的文本来创建新字符串,因为它们在堆内存中有自己的份额。如果您愿意,您可以无条件地替换所有值并告诉我们它是否会导致任何问题,尽管它不应该。
    • 应引用以空格开头或结尾的字段。
    【解决方案3】:

    按照雅树的指示,我写了如下函数(是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;
    

    【讨论】:

      【解决方案4】:

      单引号也可以正常工作,即使没有转义双引号,至少在 Excel 2016 中:

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 你应该提供一个对你有用的样本,以便 OP 可以在需要时复制和粘贴它。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-12
        • 1970-01-01
        相关资源
        最近更新 更多