Como devo escapar de vírgulas e marcas de fala em arquivos CSV para que funcionem no Excel?


110

Estou gerando um arquivo CSV (delimitado por vírgulas em vez de tabulações). Provavelmente meus usuários abrirão o arquivo CSV no Excel clicando duas vezes nele. Meus dados podem conter vírgulas e sinais de fala, então estou escapando deles da seguinte maneira.

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

Pelo que eu sei, essa sempre foi a maneira de fazer isso. Aqui está o meu problema: quando abro este arquivo no Excel 2010, meu escape não é respeitado. Marcas de fala aparecem na folha e a vírgula cria novas colunas.

Respostas:


219

Finalmente encontramos a resposta para isso.

O Excel só respeitará o escape de vírgulas e sinais de fala se o valor da coluna NÃO for precedido por um espaço. Gerando o arquivo sem espaços assim ...

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

... resolveu o problema. Espero que isso ajude alguém!


2
Este é um problema que já encontrei e sempre me esqueço dele. O Excel deve interromper esse comportamento, pois ele simplesmente cria confusão e não é uma regra útil para se ter em primeiro lugar. Esse ou csv deve ter obrigatoriamente nenhum espaço em branco entre as vírgulas.
Jacques Mathieu

61

Abaixo estão as regras se você acredita que é aleatório. Uma função de utilidade pode ser criada com base nessas regras.

  1. Se o valor contiver uma vírgula, nova linha ou aspas duplas, o valor String deve ser retornado entre aspas duplas.

  2. Quaisquer caracteres de aspas duplas no valor devem ser escapados com outra aspa dupla.

  3. Se o valor não contiver uma vírgula, nova linha ou aspas duplas, o valor String deve ser retornado inalterado.


4
Dói em alguma coisa quebrar aspas em algo que não tem vírgulas, aspas duplas ou novas linhas?
Erik Reppen

2
Não, ErikReppen, não acho que doeria normalmente. Pertenço a um plano de fundo de java onde é recomendado não criar novas strings substituindo o texto nas antigas, pois elas têm sua própria parte dentro da memória heap. Se desejar, você pode substituir todos os valores incondicionalmente e nos dizer se isso causa algum problema, embora não devesse.
AlphaBetaGamma

2
Um campo que começa ou termina com um espaço deve ser colocado entre aspas.
Jonathan Rosenne

2

De acordo com as instruções de Yashu, escrevi a seguinte função (é código PL / SQL, mas deve ser facilmente adaptável a qualquer outra linguagem).

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;

0

As aspas simples também funcionam bem, mesmo sem escapar das aspas duplas, pelo menos no Excel 2016:

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

O Excel colocará isso em 5 colunas (se você escolher a aspa simples como "Qualificador de texto" no assistente "Texto para colunas")


-3

Mesmo depois de aspas duplas, tive esse problema por alguns dias.

Delimitador de tubo substituído por vírgula, então as coisas funcionaram bem.


1
Você deve fornecer uma amostra do que funcionou para você para que o OP possa copiar e colar, se necessário.
Reuben Tanner
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.