Verdadeira diferença entre o CSV do Excel e o CSV padrão

16

Qual é a verdadeira diferença entre um CSV do Excel e um CSV padrão?

Por exemplo, ao lidar com colunas com quebras de linha em uma célula, como elas a codificam de maneira diferente?

user157195
fonte

Respostas:

19

Depende absolutamente do que você define como CSV "padrão". Para mim, o Excel segue as regras descritas na RFC 4180 , "Formato comum e tipo MIME para arquivos CSV".

Considere uma tabela em que a primeira célula da primeira linha possui duas quebras de linha. No Excel, seria semelhante ao seguinte:

+---+---------------+------------+------------+
|   | A             | B          | C          |
+---+---------------+------------+------------+
| 1 | col1, line1a  |            |            |
|   | col1, line1b  |            |            |
|   | col1, line1c  | col2, row1 | col3, row1 |
| 2 | col1, row2    | col2, row2 | col3, row2 |
+---+---------------+------------+------------+

Agora, como o Excel exportaria isso? Vamos ver - um editor de texto exibirá isso:

"col1, line1a
col1, line1b
col1, line1c","col2, row1","col3, row1"
"col1, row2","col2, row2","col3, row2"

Não é muito sofisticado. Ele insere um retorno de carro (hex 0D) onde a quebra de linha ocorreu em nossa célula. Cada célula é cercada por aspas duplas. Além disso, as linhas reais são separadas com um retorno de carro.

Para analisar isso corretamente, um analisador CSV precisaria

  • ignore esse retorno de carro quando aparecer entre aspas duplas (ou seja, uma célula)
  • não ignore esse retorno de carro quando aparecer fora das aspas duplas

Se não fizesse isso, você acabaria com algo ilegível como esse - observe que agora existem quatro linhas em vez de duas, porque não conseguiu ignorar as quebras de linha.

+---+---------------+------------+------------+
|   | A             | B          | C          |
+---+---------------+------------+------------+
| 1 | "col1, line1a |            |            |
| 2 | col1, line1b  |            |            |
| 3 | col1, line1c" | col2, row1 | col3, row1 |
| 4 | col1, row2    | col2, row2 | col3, row2 |
+---+---------------+------------+------------+

Mas, vamos ver o que a RFC diz, talvez o Excel tenha feito certo?

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

Legal, foi exatamente isso que o Excel fez. Resumindo, o Excel parece seguir as recomendações de um arquivo CSV "padrão". Dado um analisador CSV adequado, ele também deve poder ler arquivos CSV do Excel.

slhck
fonte
@shhck: por que vejo implementações de analisador csv separando "excel" csv por "csv"? Eu também achei o excel uma implementação bastante robusta.
user157195
@ user157195 Depende do analisador, você deve ler em sua documentação por que existe uma diferença entre a entrada do Excel e a entrada que não é do Excel. Eu não veria por que deveria haver um. Só sei disso no R , que trata o Excel CSV como todos os outros. No entanto, também pode ler XLS.
slhck
2
Como alguém que lê programas CSV gerados pelo Excel há anos em todas as formas e tamanhos, posso atestar que o slhck está 100% correto - o Excel produz 100% de arquivos CSV "padrão". Toda vez.
Mark Henderson
@ Farseeker Obrigado pela confirmação! (e você tem 1337 rep agora!)
slhck
5
Cuidado! Nos países que usam ',' como ponto decimal, o Excel será "muito, muito inteligente" e usará ';' caractere separador. Isso evita que Zee Germanz veja muitas "aspas"; "nos"; "seus"; "arquivos". Infelizmente, se o enviarem para o escritório do Reino Unido, o AllSmooshedUpIntoASingleCellOnEveryLine receberá. Brilhante.
Luke Usherwood
-1

Meu entendimento da implementação original do CSV era que todos os campos de texto estavam entre aspas e os números não precisavam estar. O Excel não faz isso e, se você tentar carregar os arquivos CSV gerados pelo Excel em plataformas que não sejam da Microsoft, eles falharão. Essa é uma abordagem padrão da Microsoft, ignora a interoperabilidade e concentra-se em seguir cegamente as regras. O mesmo aconteceu com o IE, eles seguiram as regras html / css corretamente para os atributos padding e margin e ignoraram o fato de que todas as páginas e navegadores da Web existentes os tratavam de maneira diferente. O resultado, quase todas as páginas da web agora têm regras especiais para o IE. Acho inúteis os arquivos csv produzidos pelo excel e uso uma coluna de funções "concatenar" para criá-los manualmente.

Edwin
fonte