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

Formatear un CSV delimitado por comas para forzar a Excel a interpretar el valor como una cadena

Llevo un rato buscando cómo dar salida a un archivo CSV de forma que obligue a Excel a interpretar los valores como una cadena y no intente convertirlos en números o fechas.

por ejemplo:

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

Excel intenta convertir “inteligentemente” todo esto a sus formatos nativos de fecha/número. ¿Hay alguna forma de evitarlo?

  • *

EDIT: Aclarada la intención de mi pregunta, perdón por la confusión.

Respuestas (5)

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

Para aquellos que tienen control sobre los datos de origen, aparentemente Excel autodetecta el formato de un campo CSV a menos que la columna CSV esté en este formato:

"=""Data Here"""

por ejemplo…

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

También funciona en Google Spreadsheet, pero no estoy seguro de que otras aplicaciones de hojas de cálculo admitan esta notación.

Si sospecha que alguno de los datos puede contener comillas en sí mismo, debe _escapar el doble, así…

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

(EDIT: Actualizado con correcciones, ¡gracias DMA57361!)

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

Como muchos, he estado luchando con las mismas decisiones que toma Microsoft y he probado varias soluciones sugeridas.

Para Excel 2007 va lo siguiente:

  • Poner todos los valores entre comillas dobles NO ayuda
  • Poner un = antes de todos los valores después de ponerlos entre comillas dobles SÍ ayuda, PERO hace que el archivo csv sea inútil para la mayoría de las demás aplicaciones
  • Poner paréntesis alrededor de las comillas dobles alrededor de todos los valores es una porquería
  • Poner un espacio antes de todos los valores antes de poner las comillas dobles alrededor de ellos SÍ evita las conversiones a fechas, pero NO evita el recorte de ceros iniciales o finales.
  • Poner una comilla simple delante de un valor sólo funciona cuando se introducen datos dentro de Excel.

Sin embargo:

Poner un tabulador delante de todos los valores antes de poner las comillas dobles alrededor de ellos SÍ evita las conversiones a fechas Y SÍ evita el recorte de los ceros iniciales o finales y la hoja ni siquiera muestra los desagradables marcadores de advertencia en la esquina superior izquierda de cada celda.

Por ejemplo

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

Tenga en cuenta que el carácter de tabulación tiene que estar dentro de las comillas dobles. Edición: resulta que las comillas dobles ni siquiera son necesarias.

Haciendo doble clic en el archivo csv se puede abrir el archivo como una hoja de cálculo en Excel mostrando todos los valores que se tratan como justo arriba, como datos de texto. Asegúrate de configurar Excel para que use el ‘.’ como punto decimal y no el ‘,’ o cada línea del archivo csv terminará como un texto en la primera celda de cada fila. Al parecer, Microsoft piensa que CSV significa “No el punto decimal” Valor Separado.

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

El uso de la funcionalidad de importación de Excel permite especificar el formato (auto, texto o fecha) con el que debe interpretarse cada columna y no requiere ninguna modificación de los archivos de datos.

Puede encontrarlo como DataGet External DataFrom Text en Excel 2007/2010.
O DataImport External DataImport Data en Excel 2003.

Aquí hay una imagen del Asistente de Importación de Texto de Excel 2003 en acción en los datos de ejemplo dados, mostrándome la importación de las dos últimas columnas como texto:

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

El ejemplo de Simon no me funcionó, y sospecho que es una diferencia de lenguaje. En C# este es el aspecto de mi cadena de formato de trabajo

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);

y este es el aspecto del archivo de salida

="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 puede ver, el formato en el archivo de salida es ="VALUE", no "=""VALUE""", que creo que puede ser una convención de Visual Basic.

Estoy usando Excel 2010. Por cierto, Google Sheets no abrirá/convertirá un archivo con este formato. Funcionará si eliminas el signo de igualdad, es decir, "VALUE", - Excel seguirá abriendo el archivo pero ignorará el hecho de que quieres que tus columnas sean cadenas.

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

Una forma sencilla de forzar a Excel a interpretar la fecha como texto es poner una comilla simple delante de la fecha, en lugar de usar comillas completas, como en

‘10/11/2002

Si puedes importar el CSV en lugar de abrirlo, puedes decirle a Excel qué formato debe tener cada columna. Echa un vistazo a esta pregunta que hice .