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

111

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

Centralscru
источник

Ответы:

219

В конце концов мы нашли ответ на это.

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."

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

Centralscru
источник
2
Это проблема, с которой я сталкивался раньше и всегда забываю о ней. Excel следует прекратить такое поведение, так как оно просто создает путаницу и изначально не является полезным правилом. В этом или CSV не должно быть пробелов между запятыми.
Жак Матье
61

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

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

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

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

АльфаБетаГамма
источник
4
Бредит ли что-то заключать в кавычки то, что не содержит запятых, двойных кавычек или новых строк?
Эрик Реппен
2
Нет, Эрик Реппен. Я не думаю, что это нормально. Я принадлежу к фону java, где не рекомендуется создавать новые строки, заменяя текст в старом, поскольку у них есть собственная доля внутри кучи. Если вы хотите, вы можете безоговорочно заменить все значения и сообщить нам, вызывает ли это какие-либо проблемы, хотя это не должно быть.
AlphaBetaGamma
2
Поле, которое начинается или заканчивается пробелом, должно быть заключено в кавычки.
Джонатан Розенн,
2

Согласно инструкциям Яшу, я написал следующую функцию (это код 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;
Aaguilera
источник
0

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

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

Excel поместит это в 5 столбцов (если вы выберете одинарную кавычку в качестве «квалификатора текста» в мастере «Преобразование текста в столбцы»)

Голимар
источник
-3

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

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

Рамкумар Наваниэтакришнан
источник
1
Вы должны дать образец того, что сработало для вас, чтобы OP мог скопировать и вставить его при необходимости.
Рубен Таннер