Parsear, leer un CSV con saltos de linea en los campos

En ocasiones un CSV nos puede dar mucha guerra a la hora de leerlo con php por cualquier motivo, en este post vamos a hablar del problema al leer CSV’s concretamente cuando alguno de los campos tiene saltos de linea.
Puede que has probado con las funciones de php str_getcsv(), fgetcsv()… y el éxito haya sido nulo… pues he aquí una función que te puede ayudar a salir del atoyadero.

function csv2Array($csvFile, $numberCols, $csvDelimiter = ";") {
	if (($contents = $csvFile) === false) {
		return false;
	}
	$fixCol = 0;
	$result = array();
	$toArray = array();
	while ($contents){
		$word = "";
		$delimiter = (++$fixCol % $numberCols) ? $csvDelimiter : "\n";
		$position = -1;
		do {
			if(($position = strpos($contents, $delimiter, ++$position)) === false) $position = strlen($contents);
			$word = substr($contents, 0, $position);
			$x = substr_count($word, '"') % 2;
			$position;
		} while ($x) ;
		if (($fixCol % $numberCols) == 1) $toArray = array($word); else $toArray[] = $word;
		if ($fixCol % $numberCols == 0) $result[] = $toArray;
		$contents = substr($contents, $position+1);
	}
	if ($fixCol % $numberCols != 0) $result[] = $toArray;
	return $result;
}

¿El modo de uso?

Tenemos que obtener el CSV, para ello usaremos la funcion de php file_get_contents():

$csvData = file_get_contents("http://www.mayorista-articulos-eroticos.es/modules/guprovensync/2014gscsv/guproven_sync2.csv");

Luego ya tenemos todo lo necesario para leer con éxito el CSV, guardaremos el array en la variable $csvArray,
Como primer parámetro le pasaremos el archivo CSV.
Como segundo la cantidad de columnas que tenga nuestro archivo.
Cmo tercero de manera opcional le pasaremos el delimitaor, que por defecto es «;»:

$csvArray = csv2Array($csvData,34);

Y para ver como nos ha quedado:

print_r($csvArray);

Y si queremos que sea un poco más legible, ya sabemos, lo envolvemos de las etiquetas «<pre>»

🙂


Tu opinión es importante para mi, ¿Te ha resultado útil este artículo?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*