Por que uma vírgula é um separador / delimitador de registro incorreto em arquivos CSV?

32

Eu estava lendo este artigo e estou curioso para saber a resposta adequada a essa pergunta.

A única coisa que me vem à cabeça é que talvez em alguns países o separador decimal seja uma vírgula e possa haver problemas ao compartilhar dados em CSV , mas não tenho certeza da minha resposta.

David Gasquez
fonte
6
Quase todo delimitador é melhor que uma vírgula. O motivo é que, quando arquivos delimitados por vírgula estão sendo lidos em algumas ferramentas de análise de dados, as vírgulas podem ser confundidas com pontuação, interrompendo o "layout" dos campos ou colunas.
Mike Hunter
33
Um cínico, ao observar que este artigo é uma peça de sopro do SAS, pode sugerir que talvez o SAS tenha problemas ao processar arquivos CSV com vírgulas :-).
whuber
3
@whuber - O SAS (na minha experiência) pode ter problemas com arquivos CSV, tenham vírgulas ou não, exigindo grandes quantidades de codificação manual para todas as coisas estranhas que o SAS não gosta.
Jeremy Miles.
8
Há um desespero na busca de delimitadores cada vez mais obscuros - tubos, peregrinos, espinhos - que sugiram que concordar e seguir um padrão é realmente a única maneira segura de as pessoas trocarem dados em arquivos de texto delimitados. E um padrão universal deve permitir que qualquer sequência de texto seja representada (como a RFC4180), em vez de confiar na suposição de que algumas não precisam ser e podem ser colocadas em outro trabalho.
Scortchi - Restabelece Monica
2
(a) Geralmente importei arquivos .csv com êxito. (b) Aconselho as pessoas a não usarem .csv se tiverem vírgulas nos dados. Estes não se contradizem. É lamentável que (b) precise de explicação em alguns setores.
Nick #

Respostas:

33

A especificação do formato CSV é definida na RFC 4180 . Esta especificação foi publicada porque

não existe especificação formal, o que permite uma grande variedade de interpretações de arquivos CSV

Infelizmente, desde 2005 (data de publicação da RFC), nada mudou. Ainda temos uma grande variedade de implementações. A abordagem geral definida na RFC 4180 é incluir campos que contenham caracteres como vírgulas entre aspas; no entanto, essa recomendação nem sempre é atendida por diferentes softwares.

O problema é que, em várias localidades européias, o caractere vírgula serve como ponto decimal; portanto, você escreve em 0,005vez de 0.005. No entanto, em outros casos, vírgulas são usadas em vez de espaços para sinalizar grupos de dígitos, por exemplo 4,000,000.00(veja aqui ). Nos dois casos, o uso de vírgulas possivelmente levaria a erros na leitura de dados de arquivos csv, porque o seu software realmente não sabe se 0,005, 0,1existem dois números ou quatro números diferentes (veja o exemplo aqui ).

Por último, mas não menos importante, se você armazenar texto em seu arquivo de dados, as vírgulas serão muito mais comuns no texto do que, por exemplo, ponto-e-vírgula; portanto, se o texto não estiver entre aspas, esses dados também poderão ser facilmente lidos com erros .

Nada melhora as vírgulas ou os separadores de campo piores , na medida em que os arquivos CSV são usados ​​de acordo com as recomendações da RFC 4180 que protegem os problemas descritos acima. No entanto, se houver o risco de usar o formato CSV simplificado que não inclua campos entre aspas ou se a recomendação puder ser usada de forma inconsistente, outros separadores (por exemplo, ponto e vírgula) parecerão uma abordagem mais segura.

Tim
fonte
6
Bem, qualquer software que implemente o padrão CSV atual, conforme definido pela RFC 4180, certamente saberá exatamente como interpretar qualquer string. O argumento de que usar em ,vez de um separador mais raro incha os dados porque você precisa escapar deles o tempo todo é verdade. E, obviamente, existem todas aquelas pessoas que pensam que sabem como o CSV funciona, mas realmente não.
Voo
2
@Voo Sim, mas como os arquivos "csv" são usados ​​de maneira caótica, é mais seguro não usar vírgulas e, em vez deles, usar outros separadores, por exemplo, ponto e vírgula. Esta é a resposta para a pergunta do OP. Não há nada "melhor" em ponto e vírgula (ou outras não vírgulas) em comparação com vírgulas; elas são simplesmente uma escolha mais segura em muitos casos.
Tim
2
@Voo +1 ao seu comentário. No entanto, qualquer pessoa que esteja usando CSV realmente não se importa com arquivos de dados inchados!
whuber
17

Tecnicamente, vírgula é tão boa quanto qualquer outro caractere a ser usado como separador. O nome do formato refere-se diretamente a valores separados por vírgula (valores separados por vírgula).

A descrição do formato CSV está usando vírgula como separador.

Qualquer campo que contenha vírgula deve estar entre aspas duplas. Portanto, isso não causa problemas para a leitura de dados. Consulte o ponto 6 da descrição :

  1. Os campos que contêm quebras de linha (CRLF), aspas duplas e vírgulas devem ser colocados entre aspas duplas.

Por exemplo, as funções read.csve write.csvde R por padrão estão usando vírgula como separador.

djhurio
fonte
4
Esta é a melhor resposta, pois se refere a valuesque são separados por vírgula. Outros aludindo a formattingnúmeros europeus , isso não é um problema para o csv standard, como você citou corretamente o ponto 6 acima. Existem divergências no "uso correto" em qualquer formato de dados. O ponto é - conheça seus dados. Outros mencionam tabou ;delimitam, no entanto, estes podem ter os mesmos problemas que vírgulas quando você lida com dados inseridos pelo usuário (talvez por meio de um formulário e capturados por um banco de dados - eu tive que discutir com campos de entrada de texto livre que as pessoas ter gordura dedos em tab... é uma porcaria)
Adrian Torrie
A resposta de Tim agora foi editada para incluir as informações fornecidas por @djhurio.
Adrian Torrie
11

Além de ser um separador de dígitos em números, também faz parte do endereço (como endereço do cliente etc.) em muitos países. Enquanto alguns países têm endereços curtos e bem definidos, muitos outros têm endereços longos, incluindo, às vezes duas vírgulas na mesma linha. Arquivos CSV bons incluem todos esses dados entre aspas duplas. Mas analisadores muito simplistas e mal escritos não permitem ler e diferenciá-los. (Então, há o problema de usar aspas duplas como parte dos dados, como citações de um poema).

Whirl Mind
fonte
2
(+1) O padrão prevê o uso de aspas duplas como parte dos dados, insistindo em duplicá-las novamente: "Belloc", "Tarantella", "" "as pulgas que provocam nos Altos Pirenéus" "". Na Inglaterra, não é incomum encontrar campos de endereço que contenham o nome de uma casa entre aspas, assim: "Chatsworth", Melton Road, Leamington. (Não está claro o porquê: Fowler resmungou que "a implicação parece ser: morar na casa que pessoas sensatas chamam de '164 Melton Road', mas um tolo gosta de chamar de 'Chatsworth'".)
Scortchi - Restabelecer Monica
1
@ Scortchi Parece que aprendemos os mesmos poemas aos 12 anos (+/- erro). Receio que o que considero infeliz esnobismo inglês da classe média alta no início do século XX obscurece o seu último exemplo, que não será transparente além de um pequeno grupo.
Nick Cox
@NickCox: Doze parece certo. Engraçado que não me lembro se li algum poema este ano, muito menos me lembro de algumas linhas deles. Embora o argumento de Fowler fosse sobre o efeito no leitor de aspas desnecessárias (veja desnecessaryquotes.com ), acho que você está certo ao ver a influência do esnobismo em sua escolha de exemplo. De qualquer forma, espero que o argumento de menor importância seja algo a observar, se você já enviou um arquivo CSV contendo endereços em inglês, é claro para todos, apesar de minhas divagações.
Scortchi - Restabelecer Monica
1
na Índia, é comum as pessoas que constroem suas primeiras casas (não apartamentos) manter um nome florido inovador, geralmente em linguagem vernacular ou frase em sânscrito e entre aspas duplas, como "Guru Kripa". Nomes como Genelia D'Souza e Derek O'Brien também são comuns. Em seguida, os endereços que dizem "Porta velha nnn / porta nova mm / c", devido à renumeração do governo, complicam ainda mais o armazenamento de endereços, por ter barras e aspas simples em cantos inesperados.
Giro Mente
@WhirlMind: Isso é interessante - eu notei muitos - bem, mais do que eu esperava - nomes de casas gaélicas e galesas escocesas na Inglaterra, que talvez seja o equivalente mais próximo a escolher um idioma vernacular para nomear sua casa.
Scortchi - Restabelecer Monica
9

Enquanto a resposta do @Tim estiver correta - eu gostaria de acrescentar que "csv" como um todo não tem um padrão comum - especialmente as regras de escape não são definidas, levando a "formatos" que podem ser lidos em um programa, mas não em outro . Isso é exacerbado pelo fato de que todo "programador" sob o sol apenas pensa em "oooh csv- eu construirei meu próprio analisador!" e depois perde todos os casos extremos.

Além disso, o csv carece totalmente da capacidade de armazenar metadados ou mesmo o tipo de dados de uma coluna - levando a vários documentos que você deve ler para entender os dados.

Christian Sauer
fonte
5
Sim, existem tools.ietf.org/html/rfc4180 padrão e muitos outros formatos não armazenam nenhum metadado, ele não foi projetado para armazenar metadados - os arquivos .txt também não armazenam metadados sobre documentos de texto ...
Tim
4
Tim, que padrão é ignorado na maioria das vezes, tornando-se um não-padrão ,,,
Christian Sauer
8
A grande coisa sobre os padrões é que existem muitos por onde escolher. (Variavelmente mutado e atribuída.)
Nick Cox
4

Se você pode abandonar o delimitador de vírgula e usar um caractere de tabulação, terá muito mais sucesso. Você pode deixar o arquivo chamado .CSV e importar para a maioria dos programas geralmente não é um problema. Basta especificar delimitado por TAB em vez de vírgula ao importar seu arquivo. Se houver vírgulas em seus dados, você terá um problema ao especificar delimitado por vírgula, como você bem sabe.

Gorila
fonte
5
Se houver guias nos seus dados, o contrário será aplicado. É apenas, pelo menos na minha experiência, menos provável.
Nick Cox
@ Nick e Gorilla: Eu tive bons resultados |como delimitador em arquivos de texto caseiros, como arquivos CSV (com títulos de livros e outros metadados de documentos). |nunca ocorre nos dados com os quais trabalho, para que eu possa escrever scripts perl que simplesmente se dividem / se juntam sem verificar a citação de qualquer tipo. Isso foi para um projeto único que envolve apenas o processamento de metadados salvos de um banco de dados do MS Access. Para qualquer projeto maior, ou se você planeja manter os dados nesse formato de arquivo a longo prazo, escolha algo mais robusto! Eu sempre poderia ajustar alguma coisa se o lote deste mês quebrasse alguma coisa.
Peter Cordes
@ PeterCordes Eu acredito em você, e o que quer que funcione. Mas, claramente, o custo dos separadores idiossincráticos pode ser a necessidade de explicá-los a outros e é essencial que eles possam importar esses arquivos de dados sem dificuldade. Diante de um formato de arquivo incomum, é necessário ter acesso a alguma rotina, função ou comando que pode dividir seqüências de caracteres em separadores arbitrários.
Nick Cox
@ PeterCordes Quando escrevi um splitcomando para o Stata, observei, entre outras coisas, o equivalente Perl para ver o que ele fazia e o que não fazia. Não é o código fonte, apenas a funcionalidade oferecida.
Nick Cox
1
@NickCox: Muitas funções do perl são muito bem projetadas, IMO. Eles fazem o trabalho sem muitas limitações especiais, como você encontra no awk (que geralmente é bom), ou esp. outras ferramentas Unix gosto cut, sorte uniq.
Peter Cordes
4

O ASCII nos fornece quatro caracteres "separadores", como mostrado abaixo em um trecho da página do manual ascii (7) * nix:

   Oct   Dec   Hex   Char
   ----------------------
   034   28    1C    FS  (file separator)
   035   29    1D    GS  (group separator)
   036   30    1E    RS  (record separator)
   037   31    1F    US  (unit separator)

Esta resposta fornece uma visão geral decente do uso pretendido.

Certamente, esses códigos de controle carecem da facilidade humana (legibilidade e entrada) de delimitadores mais populares, mas são opções aceitáveis ​​para troca interna e / ou efêmera de dados entre programas.

Ronald Straight
fonte
2
Interessante. Eu acho que nunca vi isso usado na natureza ...
Matt Krause
4

O problema não é a vírgula; o problema está sendo citado. Independentemente de quais delimitadores de registro e campo você usa, você precisa estar preparado para encontrá-los no conteúdo. Então você precisa de um mecanismo de cotação. E ENTÃO você precisa de uma maneira para os caracteres entre aspas aparecerem também.

Seguir o padrão RFC 4180 torna tudo mais simples para todos.

Pessoalmente, tive que escrever um script para provavelmente corrigir a saída de um programa que entendeu errado, por isso sou um pouco militante. "provavelmente consertar" significa que funcionou para MEUS dados, mas posso ver situações em que eles falhariam. (Em defesa desse programa, ele foi escrito antes do padrão.)

Stig Hemmer
fonte