Existe uma maneira de incluir vírgulas nas colunas CSV sem interromper a formatação?


282

Eu tenho um CSV de duas colunas com um nome e um número. O nome de algumas pessoas usa vírgulas, por exemplo. Joe Blow, CFA.Esta vírgula quebra o formato CSV, pois é interpretada como uma nova coluna.

Eu li e a receita mais comum parece substituir esse caractere ou substituir o delimitador por um novo valor (por exemplo this|that|the, other).

Eu realmente gostaria de manter o separador de vírgulas (eu sei que o Excel suporta outros delimitadores, mas outros intérpretes podem não). Eu também gostaria de manter a vírgula no nome, pois Joe Blow| CFAparece bem bobo.

Existe uma maneira de incluir vírgulas nas colunas CSV sem interromper a formatação, por exemplo, escapando-as?



Um pequeno truque que funcionou para mim: abra o arquivo csv em um editor de texto e cole em um documento do Excel. Funciona se você puder fazer isso em grandes pedaços.
Jonas

@ Jonas: O Excel não consegue adivinhar se o mesmo token é usado como um delimitador ou como parte dos dados. Colar de um editor de texto não muda isso.
11nspectable

Respostas:


370

Coloque o campo entre aspas, por exemplo

field1_value,field2_value,"field 3,value",field4, etc...

Veja a Wikipedia .

Atualizado :

Para codificar uma cotação, use ", um símbolo de aspas duplas em um campo será codificado como ""e todo o campo se tornará """". Portanto, se você vir o seguinte em, por exemplo, Excel:

---------------------------------------
| regular_value |,,,"|  ,"", |"""   |"|
---------------------------------------

o arquivo CSV conterá:

regular_value,",,,""",","""",","""""""",""""

Uma vírgula é simplesmente encapsulada usando aspas, assim ,torna - se ",".

Uma vírgula e uma citação precisam ser encapsuladas e citadas, assim ","se torna """,""".


4
Isso funcionou para mim! Eu estava exportando uma variável js para CSV e colocando um par extra de aspas em cada sequência, ajudou a resolver o problema de "John Blow, CFA", conforme mencionado na pergunta.
Madhulika Mukherjee 02/12/2015

E se houver aspas e vírgulas dentro de cada célula?
speedplane 19/02/16

2
Eu atualizei a resposta com alguns exemplos - em suma, vírgulas são encapsulados entre aspas (como ","), e citações são escapados (por exemplo """)
Ryan

6
Agora, ESTA deve ser a resposta aceita, pois propõe uma ótima solução que provavelmente resolve 99% dos casos de uso.
21718 BuZz

Existe uma biblioteca C # para analisar arquivos csv com campos com aspas?
Minh Tran

34

O problema com o formato CSV é que não há uma especificação, existem vários métodos aceitos, sem nenhuma maneira de distinguir qual deve ser usado (para gerar / interpretar). Eu discuti todos os métodos para escapar de caracteres (novas linhas nesse caso, mas a mesma premissa básica) em outro post . Basicamente, tudo se resume ao uso de um processo de geração / escape de CSV para os usuários pretendidos, e esperando que o resto não se importe.

Documento de especificação de referência .


10
RFC 4180, formato comum e tipo MIME para arquivos de valores separados por vírgula (CSV), ietf.org/rfc/rfc4180.txt ; mais uma especificação 'oficial'.
Shi

3
A inclusão da abordagem mais amplamente aceita tornaria essa uma ótima resposta. Tal como está, a resposta de @Ryan vence.
Rinogo 6/06

16

Se você quiser fazer o que disse, pode usar aspas. Algo assim

$name = "Joe Blow, CFA.";
$arr[] = "\"".$name."\"";

agora, você pode usar vírgula na sua variável name.


Graças nuvem para sua ponta, que fez isso: $whatever = "\"".$name."\"";
washere

Obrigado pela sua solução.
Bhavin Thummar 22/05/19

10

Você precisa citar esses valores.
Aqui está uma especificação mais detalhada.


2
Existem várias especificações, o Excel usa aspas na entrada, o Linux usa o caractere de barra invertida. Infelizmente, você precisa escapar para o seu público-alvo / sistema de destino.
Rudu

7

Além dos pontos em outras respostas: uma coisa a observar se você estiver usando aspas no Excel é a localização dos seus espaços. Se você tem uma linha de código como esta:

print '%s, "%s", "%s", "%s"' % (value_1, value_2, value_3, value_4)

O Excel tratará a cotação inicial como uma cotação literal em vez de usá-la para escapar vírgulas. Seu código precisará mudar para

print '%s,"%s","%s","%s"' % (value_1, value_2, value_3, value_4)

Foi essa sutileza que me trouxe aqui.


3

Eu enfrentei o mesmo problema e citar o ,não ajudou. Eventualmente, substituí o ,por +, concluí o processamento, salvei a saída em um arquivo externo e substitui o +por ,. Isso pode parecer feio, mas funcionou para mim.


2
E o que você faria se os dados contivessem caracteres "+"?
Andrew Morton

1
@AndrewMorton Sim, isso é um desafio. Mas, no meu caso, tenho certeza de que +não existe nos meus dados. Obrigado pelo seu comentário gentil.
Mohammed

4
A maneira simples e robusta é colocar as cadeias entre aspas duplas e escapar entre aspas duplas nas cadeias usando duas delas como "". Esta é a maneira normal de fazer isso.
Andrew Morton

1
Se não estiver funcionando, verifique se você não está gerando espaços ao lado das vírgulas delimitadoras: "Sapo", "amarelo, verde" funcionará "Sapo", "amarelo, verde" não funcionará
Dazbert

Pessoalmente, encontrei o segundo comentário de @AndrewMorton aqui, na verdade, me ajudou a entender o que fazer melhor do que a resposta aceita. Etapa 1 - escape de aspas duplas nos campos de dados, por exemplo, em Python: field = field.replace('"', '""')Etapa 2 - após a Etapa 1, coloque o campo entre aspas duplas, por exemplo field = '"' + field + '"'- então você é de ferro fundido, eu acho.
Will Croxford

3

Dependendo do seu idioma, pode haver um método to_json disponível. Isso escapará de muitas coisas que quebram CSVs.


3

Descobri que alguns aplicativos como o Numbers no Mac ignoram as aspas duplas, se houver espaço antes dele.

a, "b,c"não funciona enquanto a,"b,c"trabalha.


1
Você provavelmente me salvou uma hora de trabalho ... obrigado!
Shaun314 24/04



0

Você pode usar o Text_Qualifiercampo no seu gerenciador de conexões de arquivos simples como ". Isso deve agrupar seus dados entre aspas e apenas separado por vírgulas que estão fora das aspas.


0

Primeiro, se o valor do item tiver aspas duplas ("), substitua por 2 aspas duplas (" ")

item = item.ToString().Replace("""", """""")

Por fim, embrulhe o valor do item:

À ESQUERDA: Com aspas duplas (")

À DIREITA: Com aspas duplas (") e vírgula (,)

csv += """" & item.ToString() & ""","

0

As aspas duplas não funcionaram para mim, funcionaram para mim \". Se você quiser colocar aspas duplas como exemplo, pode definir \"\".

Você pode criar fórmulas, como exemplo:

fprintf(strout, "\"=if(C3=1,\"\"\"\",B3)\"\n");

irá escrever em csv:

= SE (C3 = 1, "", B3)


0

Pode não ser o necessário aqui, mas é uma pergunta muito antiga e a resposta pode ajudar outras pessoas. Uma dica que considero útil para importar para o Excel com um separador diferente é abrir o arquivo em um editor de texto e adicionar uma primeira linha como:

sep = |

onde | é o separador que você deseja que o Excel use. Como alternativa, você pode alterar o separador padrão no Windows, mas um pouco demorado:

Painel de controle> Relógio e região> Região> Formatos> Adicional> Números> Separador de listas [mude de vírgula para sua alternativa preferida]. Isso significa que o Excel também adotará como padrão a exportação de CSVs usando o separador escolhido.

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.