2010-02-23 15 views
12

Estoy tratando de analizar archivos CSV cargados por el usuario a través de PHP, pero no funciona correctamente.CSV sin comillas que no funcionan con fgetcsv

He cargado varios CSV formateados correctamente y funcionó bien, sin embargo; Tengo muchos usuarios que intentan importar archivos CSV exportados desde Excel y tienen problemas. He comparado los archivos con los míos y noté que los archivos de Excel carecen de comillas alrededor de las entradas. Aparte de eso, son idénticos. Si lo abro y lo guardo con Open Office, sin realizar ningún cambio, funciona. Así que estoy bastante seguro de que está relacionado con las comillas.

Mi pregunta es; ¿Cómo leo estos CSV con formato incorrecto?

ACTUALIZACIÓN: ¡Causa ha sido encontrada!

Esto es específico para la versión Mac de Excel. Los saltos de línea se manejan de manera diferente en Macs por algún motivo arbitrario, por lo que antes de usar fgetcsv, debe hacer esto;

ini_set('auto_detect_line_endings',TRUE); 
+0

¿Puede mostrarnos su código y decirnos cuál es el problema? Usamos fgetcsv() sin problemas, independientemente del formato. – jasonbar

+0

¡Gracias por este tipo! salvavidas –

Respuesta

22

Esto es específico para la versión Mac de Excel. Los saltos de línea se manejan de manera diferente en Macs por algún motivo arbitrario, por lo que antes de usar fgetcsv, debe hacer esto;

ini_set('auto_detect_line_endings',TRUE); 
+0

¡gracias! funciona perfectamente. – tbradley22

+0

Freaking. Increíble. Encontrar. – Stegrex

1

Mirando el manual page of fgetcsv, su prototipo se parece a esto:

array fgetcsv (resource $handle [, int $length 
    [, string $delimiter = ',' [, string $enclosure = '"' 
    [, string $escape = '\\' ]]]]) 

El valor por defecto para $enclosure(es decir, el cuarto parámetro) es una comilla doble.

¿Qué sucede si intentas especificar que no quieres ningún alojamiento, especificando una cadena vacía para ese cuarto parámetro?

(Por supuesto, esto podría romper lo que ahora está funcionando, lo que significa que tendría que lidiar con dos casos separados: archivos con campos entre comillas dobles y archivos que no pudieron leerse primero case)

+0

Sí, lo vi. Pero, como dijiste, rompe lo que actualmente funciona. ¿No hay una forma simple de verificar en qué formato está almacenado y cambiar el comportamiento de forma apropiada? –

+0

Supongo que algunas expresiones regulares le permitirán determinar en qué formato está un archivo ;; otra solución sería intentar siempre la primera * solución (caso más frecuente) * y, si no funciona, probar la segunda ;; considerando que todas las líneas de su archivo probablemente estén formateadas de la misma manera, hacer la prueba solo para la primera línea debería ser suficiente, lo que significa que solo haría 1 llamada "inútil" a 'fgetcsv'. –

+0

Lo intenté, resulta que los armarios en blanco no funcionan ... –

Cuestiones relacionadas