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

64

He estado buscando durante un tiempo tratando de descubrir cómo generar un archivo CSV de tal manera que obligue a Excel a interpretar los valores como una cadena y no intente convertirlos en números o fechas.

p.ej:

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

Excel intenta convertir "inteligentemente" todo esto a sus formatos de fecha / número nativos. ¿Hay alguna manera de evitar eso?


EDITAR: Aclaró la intención de mi pregunta, perdón por la confusión.

Simon East
fuente

Respuestas:

67

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

"=""Data Here"""

p.ej...

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

También funciona en la hoja de cálculo de Google, pero no estoy seguro de si otras aplicaciones de hoja de cálculo admiten esta notación.

Si sospecha que alguno de los datos puede contener comillas en sí mismo, debe escapar dos veces , de esta manera ...

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



(EDITAR: actualizado con correcciones, ¡gracias DMA57361!)

Simon East
fuente
Impresionante, solo necesitamos cambiar los datos ... suspiro
Caro
44
Esa última columna debería ser de "=""123"""otra manera está mal formada. Los campos que contienen a "deben estar delimitados y la "s en el campo escapó con otras "s.
DMA57361
@ DMA57361 en realidad la forma en que lo tiene está bien, son los otros dos campos a su lado a los que les falta el signo igual antepuesto. Lo que puso allí es configurar la fórmula de esa celda para que devuelva una cadena. Para evitar esto también, puede establecer el tipo de datos de la celda en "Texto".
Avance
2
@Breakthrough esa tabla allí representa un archivo CSV, no campos de Excel. El último valor ="123"no es un campo CSV válido porque contiene el carácter delimitador de campo " sin delimitarlo correctamente o el campo. El hecho de que Excel lo lea como una fórmula depende exclusivamente de Excel y no tiene nada que ver con el archivo CSV.
DMA57361
2
@PriceChild, el punto de mi pregunta original (que realmente no expliqué muy bien) fue en realidad cómo formatear el CSV para que sea lo más fácil posible para los usuarios. Y esta es la respuesta que encontré y quería publicar. DMA57361 también trajo una corrección útil, ¡gracias!
Simon East
36

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

Para Excel 2007, lo siguiente es:

  • Poner todos los valores entre comillas dobles NO ayuda
  • Poner un = antes de todos los valores después de ponerlos en dobles comillas ayuda, PERO hace que el archivo csv sea inútil para la mayoría de las otras aplicaciones
  • Poner paréntesis alrededor de las comillas dobles alrededor de todos los valores es basura
  • Poner un espacio antes de todos los valores antes de poner comillas dobles alrededor de ellos NO previene las conversiones a las fechas, pero NO impide el recorte de ceros iniciales o finales.
  • Poner una comilla simple delante de un valor solo funciona al ingresar datos dentro de Excel.

Sin embargo:

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

P.ej:

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

Tenga en cuenta que el carácter de tabulación debe estar entre comillas dobles. Editar: resulta que las comillas dobles ni siquiera son necesarias.

Al hacer doble clic en el archivo csv, se puede abrir el archivo como una hoja de cálculo en Excel que muestra todos los valores que se tratan como arriba, como datos de texto. Asegúrese de configurar Excel para usar el '.' como el punto decimal y no el ',' o cada línea del archivo csv terminará como un texto en la primera celda de cada fila. Aparentemente, Microsoft piensa que CSV significa "No el punto decimal" Valor separado.

ajabo
fuente
Este truco de pestañas me salvó el día, Excel estaba convirtiendo valores numéricos realmente largos en números y perdió todos los dígitos después del 15. Logré que Excel los tratara como texto con el prefijo de la pestaña. También funciona para los números, no solo para las fechas.
Markus Yrjölä
Esto es realmente útil, gracias!
Flavio
22

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

Puede encontrarlo como DataGet External DataFrom Texten Excel 2007/2010.
O DataImport External DataImport Dataen Excel 2003.

Aquí hay una imagen del Asistente de importación de texto de Excel 2003 en acción sobre los datos de ejemplo proporcionados, que me muestra cómo importar las dos últimas columnas como texto:

Excel 2003: Asistente de importación de texto en el paso 3 - tipos de datos

DMA57361
fuente
Excelente respuesta DMA57361, gracias por todos los detalles. Lo que realmente no mencioné en mi pregunta es que estoy escribiendo un script que exporta datos a Excel, por lo que estaba tratando de evitar que los usuarios tuvieran que pasar por opciones confusas como esta. Pero te voté de todos modos. :-)
Simon East
@ Simon, ¿en qué estás escribiendo el guión? ¿De alguna manera puede lograr que produzca archivos de Excel reales directamente, en lugar de pasar por un formato intermedio?
DMA57361
Es un script PHP que exporta una tabla de base de datos. CSV es probablemente la forma más fácil de trabajar, pero tienes razón, probablemente podría producir un XLS con la ayuda de algún código de código abierto, o incluso solo una tabla HTML que creo que por experiencia previa produce resultados razonables en Excel (permite colores y formato, etc., pero no estoy seguro acerca de los tipos de datos).
Simon East
1
Hay algunas preguntas sobre SO sobre PHP → Excel, las primeras que he probado tienen una respuesta que apunta a PHP Excel , por lo que vale la pena echarle un vistazo.
DMA57361
eso es muy útil, después de leer bastantes respuestas
greg121
1

El ejemplo de Simon no funcionó para mí, y sospecho que es una diferencia de idioma. En C #, así es como se ve 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 así es como se ve el 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 ="VALUE",no es lo "=""VALUE""",que creo que puede ser una convención de Visual Basic.

Estoy usando Excel 2010. A propósito, Google Sheets no abrirá / convertirá un archivo formateado de esta manera. Funcionará si elimina el signo igual de esta manera "VALUE",: Excel aún abrirá el archivo pero ignorará el hecho de que desea que sus columnas sean cadenas.

Shane
fuente
-2

Una forma sencilla de obligar 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 puede importar el CSV en lugar de abrirlo, puede decirle a Excel qué formato debe tener cada columna. Echa un vistazo a esta pregunta que hice .

hdhondt
fuente
55
Voto negativo debido a que esto NO funciona en archivos CSV que se importan a Excel. Excel interpreta la cita como una cita literal y, por lo tanto, la muestra en la celda.
psynnott