Как избежать запятых и речевых знаков в CSV-файлах, чтобы они работали в Excel?

Я создаю CSV-файл (разделенный запятыми, а не вкладками). Мои пользователи, скорее всего, откроют файл CSV в 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 2010, мой побег не соблюдается. Речевые знаки появляются на листе, а запятая вызывает новые столбцы.

5 ответов


в конце концов мы нашли ответ на этот вопрос.

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. Если значение содержит запятую, новую строку или двойную кавычку, то строковое значение должно быть возвращено в двойных кавычках.

  2. любые символы двойной кавычки в значении должны быть экранированы с другой двойной кавычкой.

  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;

одинарные кавычки тоже отлично работают, даже не избегая двойных кавычек, по крайней мере, в Excel 2016:

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

Excel поместит это в 5 столбцов (если вы выберете одинарную кавычку как "text qualifier" в Мастере "Text to columns")


даже после двойных кавычек у меня была эта проблема в течение нескольких дней.

заменил разделитель трубы запятой, тогда все работало нормально.