Formatar um CSV delimitado por vírgulas para forçar o Excel a interpretar o valor como uma sequência

64

Venho pesquisando há algum tempo tentando descobrir como gerar um arquivo CSV de maneira a forçar o Excel a interpretar os valores como uma sequência e não tentar convertê-los em números ou datas.

por exemplo:

"141", "10/11/2002", "350.00", "1311742251"

O Excel tenta "inteligentemente" converter tudo isso em seus formatos de data / número nativos. Existe uma maneira de contornar isso?


EDIT: Esclareceu a intenção da minha pergunta, desculpe por confusão.

Simon East
fonte

Respostas:

67

Para aqueles que têm controle sobre os dados de origem, aparentemente o Excel detectará automaticamente o formato de um campo CSV, a menos que a coluna CSV esteja neste formato:

"=""Data Here"""

por exemplo...

20,       5.5%,      "0404 123 351", "3-6",  "=""123"""
[number]  [percent]  [number]        [date]  [string]  <-- how Excel interprets

Também funciona na planilha do Google, mas não tem certeza se outros aplicativos de planilha suportam essa notação.

Se você suspeitar que os dados possam conter aspas, precisará escapá- los duas vezes , desta forma ...

"=""She said """"Hello"""" to him"""



(EDIT: Atualizado com correções, obrigado DMA57361!)

Simon East
fonte
Awesome, só precisamos de mudar os dados .. suspiro
Caro
4
Essa última coluna deve ter "=""123"""outra forma, está mal formada. Os campos contendo a "devem ser delimitados e os "s no campo escapados com outros "s.
DMA57361
@ DMA57361 na verdade, do jeito que ele está, tudo bem, são os outros dois campos ao lado que estão faltando o sinal de igual precedido. O que ele colocou lá está definindo a fórmula dessa célula para retornar uma string. Para também evitar isso, você pode definir o tipo de dados da célula como "Texto".
Breakthrough
2
@ Breakthrough nessa tabela lá representa um arquivo CSV, não campos do Excel. O último valor ="123"não é um campo CSV válido porque contém o caractere delimitador de campo " sem o delimitar corretamente ou ao campo. O fato de o Excel lê-lo como uma fórmula depende exclusivamente do Excel e nada tem a ver com o arquivo CSV.
DMA57361
2
@PriceChild, o ponto da minha pergunta original (que eu realmente não expliquei muito bem) era como formatar o CSV para facilitar o máximo possível para os usuários. E essa é a resposta que eu me encontrei e queria postar. DMA57361 também trouxe uma correção útil também, obrigado!
Simon East
36

Como muitos, tenho lutado com as mesmas decisões que a Microsoft toma e tentou várias soluções sugeridas.

Para o Excel 2007, segue o seguinte:

  • Colocar todos os valores entre aspas duplas NÃO ajuda
  • Colocar um = antes de todos os valores depois de colocá-los em aspas duplas ajuda, MAS torna o arquivo csv inútil para a maioria dos outros aplicativos
  • Colocar parênteses entre aspas duplas em torno de todos os valores é um lixo
  • Colocar um espaço antes de todos os valores antes de colocar aspas duplas em torno deles impede conversões para datas, mas NÃO impede o corte de zeros à esquerda ou à direita.
  • Colocar uma aspas simples na frente de um valor só funciona ao inserir dados no Excel.

Contudo:

Colocar uma guia antes de todos os valores antes de colocar aspas duplas em torno deles evita conversões para datas E evita o corte de zeros à esquerda ou à direita e a planilha nem mostra marcadores de aviso desagradáveis ​​no canto superior esquerdo de cada célula.

Por exemplo:

"<tab character><some value>","<tab character><some other value>"

Observe que o caractere de tabulação deve estar entre aspas duplas. Edit: acontece que as aspas duplas nem são necessárias.

Clicar duas vezes no arquivo csv pode abrir o arquivo como uma planilha no Excel, mostrando todos os valores tratados como acima, como dados de texto. Certifique-se de definir o Excel para usar o '.' como ponto decimal e não o ',' ou todas as linhas do arquivo csv terminarão como um texto na primeira célula de cada linha. Aparentemente, a Microsoft acha que CSV significa "Valor não separado pelo ponto decimal".

ajabo
fonte
Esse truque de guia salvou meu dia, o Excel estava convertendo valores numéricos realmente longos em números e perdeu todos os dígitos após o dia 15. Conseguiu que o Excel os tratasse como texto com o prefixo da guia. O mesmo vale para números, não apenas para datas.
Markus Yrjölä
Isso é realmente útil, obrigado!
Flavio
22

O uso da funcionalidade de importação do Excel permite especificar o formato (automático, texto ou data) em que cada coluna deve ser interpretada como e não requer nenhuma modificação nos arquivos de dados.

Você pode encontrá-lo como DataGet External DataFrom Textno Excel 2007/2010.
Ou DataImport External DataImport Datano Excel 2003.

Aqui está uma imagem do Assistente para importação de texto do Excel 2003 em ação nos dados de exemplo fornecidos, mostrando-me a importação das duas últimas colunas como texto:

Excel 2003: Assistente de Importação de Texto na Etapa 3 - tipos de dados

DMA57361
fonte
Excelente resposta DMA57361, obrigado por todos os detalhes. O que eu realmente não mencionei na minha pergunta é que estou escrevendo um script que exporta dados para o Excel, então estava tentando impedir que os usuários precisassem passar por opções confusas como essa. Mas votou em você de qualquer maneira. :-)
Simon East
@ Simon, no que você está escrevendo o script? De alguma maneira você pode conseguir produzir arquivos reais do Excel diretamente, em vez de passar por um formato intermediário?
DMA57361 08/08/19
é um script PHP que exporta uma tabela de banco de dados. O CSV é provavelmente o mais fácil de se trabalhar, mas você está correto, eu provavelmente poderia produzir um XLS com a ajuda de algum código de código-fonte aberto, ou mesmo apenas uma tabela HTML que, a meu ver, de experiências anteriores produz resultados razoáveis ​​no Excel (permite cores e formatação etc., mas não tem certeza sobre os tipos de dados).
Simon East
11
Existem algumas perguntas sobre SO sobre PHP → Excel, as primeiras que eu tentei têm uma resposta apontando para o PHP Excel , então vale a pena dar uma olhada.
DMA57361 08/08/19
Isso é muito útil, depois de ler algumas ansers
greg121
1

O exemplo de Simon não funcionou para mim e suspeito que seja uma diferença de idioma. Em C #, aqui está a aparência da minha string de formato de trabalho:

var linebreak = (i++ == list.Count) ? "" : "\r\n";

csv += String.Format("=\"{0}\",{1},{2},{3},=\"{4}\"{5}",
    item.Value, item.Status, item.NewStatus, item.Carrier, c.Status, linebreak);

e é assim que o arquivo de saída se parece:

="abababababab",INVALID,INVALID,USPS,="",
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793482982812",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793482982812",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793000216184",UNKNOWNSTATUS,INVALID,USPS,=""

Como pode ser visto, o formato no arquivo de saída ="VALUE",não é o "=""VALUE""",que acredito ser uma convenção do Visual Basic.

Estou usando o Excel 2010. Aliás, o Planilhas Google não abrirá / converterá um arquivo formatado dessa maneira. Funcionará se você remover o sinal de igual assim "VALUE",- o Excel ainda abrirá o arquivo, mas ignorará o fato de que você deseja que suas colunas sejam cadeias de caracteres.

Shane
fonte
-2

Uma maneira simples de forçar o Excel a interpretar a data como texto é colocar uma aspas simples antes da data, em vez de usar aspas completas, como em:

11/10/2002

Se você puder importar o CSV em vez de abri-lo, poderá informar ao Excel qual formato cada coluna deve ter. Dê uma olhada nesta pergunta que eu fiz .

hdhondt
fonte
5
Voto negativo devido a isso NÃO funcionar em arquivos CSV sendo importados para o Excel. O Excel interpreta a cotação como uma cotação literal e, portanto, a mostra na célula.
precisa saber é o seguinte