PHP - No me importa csv

   
Vista:

No me importa csv

Publicado por Pablo (5 intervenciones) el 26/09/2012 22:10:11
Tengo un problema al importar un csv cuyo delimitador de campo es una coma (,) y el cualificador de texto dobles comillas.
El código es este:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$fila = 1;
$abrearchivo = fopen($archivo,"r"); // Abrimos el archivo en modo lectura, esto sitúa el puntero en la primera línea.
while (($datos = fgetcsv($abrearchivo, 10000, ",")) !== FALSE ){
    $numero_campos = count($datos);
    $fila++;
	$i = 0;
	$comillas = "\"";
	$comilla = "'";
	$cadena = "INSERT INTO clientes (Customer_Name, Customer_number,
        Address_line1, Address_line2, City, State, Postal_code, Country, Active, Category,
         VAT_number) VALUES (";
	//No sé por qué pero esto no funciona.
	$datos[$i] = str_replace($comillas, $comilla, $datos[$i]); 
	for ($i = 0; $i < $numero_campos; $i++){
        if ($i == ($numero_campos - 1))
        $cadena = $cadena . $datos[$i]; //
        else
        $cadena = $cadena . $datos[$i].",";
    }
    $cadena = $cadena . ");";
    echo $cadena."<br>";
    $conexion = mysql_connect($host,$usuario,$pass) or die("No se ha realizado la conexión al servidor");
    $seleccion_db = mysql_select_db($basededatos,$conexion) or die("No se ha realizado la conexión a la base de datos");
    $consulta = mysql_query($cadena,$conexion);
    mysql_close($conexion);
}
fclose($abrearchivo); // y aquí cerramos el fichero abierto para lectura.
echo "Se han insertado $fila registos en la tabla clientes";

El código daba errores que he ido solucionando, como el tiempo de ejecución del script, que no había definido $i, que no reconocía \ como carácter de escape, etc.
Al final, me lista los 5656 registros que componen el csv, y me da el mensaje "Se han insertado 5.656 registros en la tabla clientes".
He probado a copiar el valor de "echo $cadena . <br>"; para un registro y pegarlo en la ventana SQL de phpmyadmin, dándome un error en la primera línea.
He comprobado que el problema viene porque me quita las comillas dobles, sí, pero no me las sustituye por simples (claro, así una empresa se convierte en dos campos en cuanto tenga una coma en el nombre).
Tenía:
1
$datos[$i] = str_replace("\"", "'", $datos[$i]);

y he sustituido esas expresiones por variables, a ver si por esas, pero tampoco.
Si comento esa parte de código, y arreglo el fichero a mano, importándolo a Access y exportándolo separado por comas y cualificado por comillas simples, funciona perfectamente.
Por cierto, otro problema:
El fichero me viene con encabezados. Pensaba que haciendo $fila = 2, en lugar de a 1 se iría a la fila 2 y no me trataría de importar los encabezados, pero también me los importaba, por lo que he decidido quitarlos. ¿Cómo puedo inicializar la lectura en la fila 2?.
Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

No me importa csv

Publicado por Ignacio Esviza ignacio@esviza.com (16 intervenciones) el 26/09/2012 22:52:07
Sugerencias:

1. Obtené una fila del CSV

2. Creá un array con los valores de la fila:

1
$datos = explode( ',', $fila );


3. Hacé una limpieza de los valores:

1
2
3
4
5
6
7
8
9
10
11
$limpios = array();
foreach( $datos as $clave => $valor )
{
    // limpiamos las comillas dobles que pudiera tener el campo
    $valor = str_replace( "\"", '', $valor );
    // escapamos cualquier caracter que necesite ser escapado
    $valor = mysql_real_scape_string( $valor );
    // encerramos en comillas simples el valor
    $limpios[$clave] = "'{$valor}'";
}


4. Hacés el insert con esos datos limpios:

$sql = "INSERT ... VALUES ( " . implode( ',', $limpios ) . ")";
mysql_query( $sql );

5. Repetir pasos 1 al 4 hasta completar las filas del CSV.

Saludos
Ignacio
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

No me importa csv

Publicado por Pablo (5 intervenciones) el 27/09/2012 13:35:27
¡Gracias!
He hecho lo que me has dicho y he visto que por alguna razón, el array del foreach ya sale "limpio" de dobles comillas.
Entonces lo he vuelto a construir haciendo que $datos[$i] sea:
1
"'{$datos[$i]}'"

Lo he probado con un par de registros y después con los mas de 5.000 y funciona perfectamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar