Escapa adequadamente a aspas duplas no CSV

164

Eu tenho uma linha como esta no meu CSV:

"Samsung U600 24"","10000003409","1","10000003427"

A cotação ao lado de 24é usada para expressar polegadas, enquanto a cotação ao lado da cotação fecha o campo. Estou lendo a linha com, fgetcsvmas o analisador comete um erro e lê o valor como:

Samsung U600 24",10000003409"

Tentei colocar uma barra invertida antes da citação em polegadas, mas só recebi uma barra invertida no nome:

Samsung U600 24\"

Existe uma maneira de escapar adequadamente disso no CSV, para que o valor seja Samsung U600 24", ou eu tenho que regexá-lo no processador?

srgb
fonte
21
Apenas dobre sua cotação. Isso é tudo
Seu senso comum

Respostas:

281

Use 2 aspas:

"Samsung U600 24"""
user4035
fonte
101
RFC-4180, parágrafo "Se aspas duplas forem usadas para delimitar campos, uma aspas dupla aparecendo dentro de um campo deve ser escapada precedendo-a com outra aspas duplas."
tommed
4
Como diz tommed, você só precisa adicionar uma única citação dupla para escapar de uma citação dupla. Você pode usar uma ferramenta de linha de comando chamado csvfix para detectar quaisquer linhas que não estão em conformidade: verificação csvfix -nl -v [nome]
Sam Critchley
2
@ SamCritchley Vejo apenas uma única citação dupla sendo usada para escapar daqui. Por "Usar 2 aspas", user4035 significa que 1 cotação deve ser substituída por 2 aspas. Ao escapar aspas duplas com aspas duplas, você efetivamente cria pares de aspas duplas (2 aspas duplas). A citação final que você vê no final é finalizar o campo.
Zenexer 9/09/16
1
simples duplo duplo simples aspas duplas são obrigatórias, mas somente se for seguido por uma dupla aspas simples ... boa sorte!
Daniel Waltrip
14

Não apenas aspas duplas, você precisará de aspas simples ( '), aspas duplas ( "), barra invertida ( \) e NUL (o byte NULL).

Use fputcsv()para escrever e fgetcsv()ler, que cuidará de tudo.

Angelin Nadar
fonte
3
Este comentário na página de documentação dafputcsv() mostra como você pode usar fputcsv()quando deseja produzir no formato csv para o navegador em vez de um arquivo real.
dennisschagt
15
@Angelin Nadar, você poderia adicionar uma fonte à sua reivindicação sobre a necessidade de aspas simples, barra invertida e NUL? Não o encontrei na RFC-4180 .
Petr 'PePa' Pavel 13/08/16
2
Você não precisa escapar de aspas simples, etc. Um arquivo CSV adequado nem precisa adicionar aspas duplas em torno de um campo que contém apenas aspas simples. Se o leitor CSV for implementado corretamente, ele deverá ler o arquivo corretamente, mesmo com esses símbolos.
xji
4
Por que essa resposta foi votada? O comentário sobre caracteres que escapam nunca foi copiado e a pergunta original não pergunta sobre PHP. Isso parece verdadeiro apenas para o delimitador de strings (e apenas para o delimitador escolhido) quando um programa, como o Open Office, permite que você o altere.
Dave F
0

Eu sei que este é um post antigo, mas aqui está como eu o resolvi (junto com a conversão de valores nulos em string vazia) em C # usando um método de extensão.

Crie uma classe estática com algo como o seguinte:

    /// <summary>
    /// Wraps value in quotes if necessary and converts nulls to empty string
    /// </summary>
    /// <param name="value"></param>
    /// <returns>String ready for use in CSV output</returns>
    public static string Q(this string value)
    {
        if (value == null)
        {
            return string.Empty;
        }
        if (value.Contains(",") || (value.Contains("\"") || value.Contains("'") || value.Contains("\\"))
        {
            return "\"" + value + "\"";
        }
        return value;
    }

Em seguida, para cada string que você está gravando no CSV, em vez de:

stringBuilder.Append( WhateverVariable );

Você apenas faz:

stringBuilder.Append( WhateverVariable.Q() );
Scott R. Frost
fonte
-1

Se um valor contiver vírgula, caractere de nova linha ou aspas duplas, a sequência deverá ser colocada entre aspas duplas. Por exemplo: "Caractere de nova linha neste campo \ n".

Você pode usar a ferramenta on-line abaixo para "" escapar aos operadores e. https://www.freeformatter.com/csv-escape.html#ad-output

Hari Krishna
fonte