Как я могу избежать запятых и речевых меток в файлах 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, мое экранирование не соблюдается. На листе появляются метки речи, а запятая вызывает новые столбцы.

Ответ 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."

... исправлена ​​проблема. Надеюсь, это поможет кому-то!

Ответ 2

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

  • Если значение содержит запятую, новую строку или двойную кавычку, тогда значение String должно быть возвращено в двойные кавычки.

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

  • Если значение не содержит запятую, новую строку или двойную кавычку, тогда Значение строки должно быть возвращено без изменений.

Ответ 3

В соответствии с инструкциями 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;

Ответ 4

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

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