2011-08-03 08:39:00 +0000 2011-08-03 08:39:00 +0000
64
64

Formatação de um CSV delimitado por vírgulas para forçar o Excel a interpretar o valor como uma string

Tenho procurado durante algum tempo para tentar descobrir como emitir um ficheiro CSV de modo a forçar o Excel a interpretar os valores como uma string e não tentar convertê-los em números ou datas.

e.g:

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

Excel tenta “inteligentemente” converter todos estes valores para os seus formatos de data/número nativos. Haverá alguma forma de contornar isto?


EDIT: Clarificou a intenção da minha pergunta, desculpem a confusão.

Respostas (5)

70
70
70
2011-08-03 08:39:57 +0000

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

"=""Data Here"""

eg…

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

Também funciona no Google Spreadsheet, mas não tem a certeza se outras aplicações de folha de cálculo suportam esta notação.

Se suspeitar que algum dos dados possa conter citações em si, precisa de double-escape deles, assim…

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

(EDIT: Actualizado com correcções, obrigado DMA57361!)

39
39
39
2014-01-20 13:02:48 +0000

Como muitos, tenho-me debatido com as mesmas decisões que a Microsoft toma e experimentado várias soluções sugeridas.

Para o Excel 2007 vai o seguinte:

  • Colocar todos os valores entre aspas duplas NÃO ajuda & - Colocar um =* antes de todos os valores depois de os colocar entre aspas duplas ajuda, MAS torna o ficheiro csv inútil para a maioria das outras aplicações & - Colocar parênteses em torno das aspas duplas em torno de todos os valores é um disparate
  • Colocar um espaço antes de todos os valores antes de os colocar entre aspas duplas impede conversões para datas, mas NÃO impede o corte de zeros à esquerda ou à direita.
  • Colocar uma única aspas em frente de um valor só funciona quando se introduzem dados dentro do Excel.

& Contudo:

Colocar uma tabulação antes de todos os valores antes de colocar aspas duplas à sua volta Impede conversões para datas E Impede o corte de zeros à esquerda ou à esquerda e a folha nem sequer mostra marcadores de aviso desagradáveis no canto superior esquerdo de cada célula.

E.g:

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

Note-se que o caractere do separador tem de estar dentro das aspas duplas. Editar: acontece que as aspas duplas não são sequer necessárias.

Clique duas vezes no ficheiro csv pode abrir o ficheiro como uma folha de cálculo em Excel mostrando todos os valores que são tratados como acima, como dados de texto. Certifique-se de definir o Excel para usar o ‘.’ como ponto decimal e não o ‘,’ ou cada linha do ficheiro csv acabará como um texto na primeira célula de cada linha. Aparentemente, a Microsoft pensa que o CSV significa “Não o ponto decimal” Valor Separado.

22
22
22
2011-08-03 09:13:56 +0000

A utilização da funcionalidade de importação do Excel permite especificar o formato (automático, texto ou data) cada coluna deve ser interpretada como e não requer qualquer modificação nos ficheiros de dados.

Pode encontrá-lo como DataGet External DataFrom Text no Excel 2007/2010.
Ou DataImport External DataImport Data em Excel 2003.

Aqui está uma imagem do Assistente de Importação de Texto do Excel 2003 em acção sobre os dados do exemplo dado, mostrando-me a importar as duas últimas colunas como texto:

2
2
2
2013-01-13 22:37:27 +0000

O exemplo de Simon não funcionou para mim, e suspeito que seja uma diferença linguística. Em C# aqui está o aspecto da minha cadeia de formatos 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 este é o aspecto do ficheiro de saída:

="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 se pode ver, o formato no ficheiro de saída é ="VALUE", e não "=""VALUE""", o que acredito que possa ser uma convenção Visual Basic.

Estou a utilizar o Excel 2010. A propósito, Google Sheets não irá abrir/converter um ficheiro formatado desta forma. Funcionará se remover o sinal de igualdade assim "VALUE", - o Excel ainda abrirá o ficheiro mas ignorará o facto de querer que as suas colunas sejam cordas.

-2
-2
-2
2013-01-13 23:23:56 +0000

Uma forma simples de forçar o Excel a interpretar a data como texto é colocar uma única citação antes da data, em vez de usar citações completas, como em:

‘10/11/2002

Se puder importar o CSV em vez de o abrir, pode dizer ao Excel qual o formato que cada coluna deve ter. Dê uma vista de olhos esta pergunta que fiz .