2011-03-29 15 views
10

Estoy usando PHP para importar un archivo CSV, que se origina a partir de una hoja de cálculo de Excel. Algunos de los campos contienen saltos de línea, por lo que cuando vuelvo a abrir el csv en la hoja de cálculo excel/open office, se malinterpreta dónde debe pasar el salto de línea.Importación de CSV que tiene saltos de línea dentro de los campos reales

También en mi secuencia de comandos, usando fgetcsv para ir a través de cada línea, está incorrectamente dividiendo la línea donde no debería estar.

pude limpiar manualmente los datos, pero a) que tomaría las edades como es un archivo de 10k línea, y b) Los datos se exportan desde unos clientes pieza de software existentes

Cualquier ideas sobre cómo resolver automáticamente este en el proceso de importación? Pensé que delimitar los campos lo hubiera ordenado pero no es así.

+1

siempre que los campos con saltos de línea se citan '" foo \ nbar "' las alineaciones de columna no deberían verse afectadas – xzyfer

+1

LF se debería codificar como '\ n' en los campos CSV. Necesitará un lector personalizado para deshacer ese daño de exportación. Mire a través de http://php.net/fgetcsv, pero probablemente tendrá que buscar o escribir uno. – mario

+2

posible duplicado (http://stackoverflow.com/questions/3278375/how-can-you-parse-excel-csv-data-that-contains-linebreaks-in-the-data) – xzyfer

Respuesta

3

Tuve ese problema y no encontré una manera de leer los datos correctamente.

En mi caso fue una importación de una sola vez, así que hice un script que buscaba todos los saltos de línea dentro de una columna y lo reemplazaba con algo como #####. Luego importé los datos y los reemplacé por saltos de línea.

Si necesita una importación regular, puede escribir su propio analizador CSV, que se encarga del problema. Si las columnas de texto están dentro de "", puede tratar todo entre dos "" como una sola columna (con la verificación del " escapado dentro del contenido).

+0

¿Te importaría compartir el código o la expresión regular que usaste para esto? – Zahymaka

0

Sí, necesita encontrar esa coma y reemplazarla por algunos caracteres especiales como la combinación de {()} y finalmente reemplazarlos por , que está buscando originalmente.

Espero que te ayude.

+3

lo siento, pero esto no ayuda en absoluto, por favor lea la pregunta completa antes de responder – Horse

11

La respuesta aceptada no resolvió el problema para mí, pero finalmente encontré esta biblioteca de analizador CSV en código de Google que funciona bien para campos de líneas múltiples en archivos CSV.

parsecsv-para-php: http://code.google.com/p/parsecsv-for-php/

+0

gracias por compartir :) – simon

+0

+1 ¡Hasta ahora, el mejor analizador! mejor que str_getcsv o similar. Mis datos contenían HTML y nuevas líneas dentro de los campos. ¡Este es el único analizador que acertó! ¡Gracias! – lepe

+1

Es un poco triste que sea tan difícil encontrar un analizador preciso para uno de los formatos más comunes de uno de los lenguajes de programación más utilizados. Supongo que es en parte porque no hay un estándar oficial, pero los saltos de línea dentro de los valores citados son DEFINITIVAMENTE algo que un analizador CSV debería ser capaz de manejar. – danieltalsky

1

Mi solución es la siguiente:

nl2br(string); 

http://php.net/manual/en/function.nl2br.php

Una vez en el nivel de células individuales (cadena), ejecutarla en el cadena y convertirá los saltos de línea a html breaks para usted.

0

Aunque es una pregunta antigua, la respuesta podría ser relevante para personas. Actualmente hay una nueva biblioteca (independiente del marco) http://csv.thephpleague.com/ que admite caracteres NL en los campos, así como algunos filtros.

0

Es un hilo antiguo pero encontré este problema y lo resolví con una expresión regular para que pueda evitar una biblioteca solo por eso. Aquí el código está en PHP pero se puede adaptar a otro idioma.

$parsedCSV = preg_replace('/(,|\n|^)"(?:([^\n"]*)\n([^\n"]*))*"/', '$1"$2 $3"', $parsedCSV);

Esta solución supone los campos que contienen un salto de línea están encerrados por comillas dobles, lo que parece ser una suposición válida, al menos por lo que he visto hasta ahora.Además, las comillas dobles deben seguir un , o colocarse al comienzo de una nueva línea (o primera línea).

Ejemplo:

field1,"field2-part1\nfield2-part2",field3

Aquí, el \ n se sustituye por un espacio en blanco de modo que el resultado sería:

field1,"field2-part1 field2-part2",field3

la expresión regular debe manejar múltiples saltos de línea también.

Esto puede no ser eficiente si el contenido es demasiado grande, pero puede ayudar en muchos casos y la idea se puede reutilizar, quizás optimizando haciendo esto para trozos más pequeños (pero tendría que manejar los cortes con arreglo de gran tamaño).

Cuestiones relacionadas