Ok cluster, muchas gracias.
Con respecto a lo de $csvconcampos:
Si $csvconcampos es no vacio quiere decir que la primera linea tiene el nombre de las columnas separadas por coma (o el separador especificado).
Por ej:
Código:
Hora;Lunes;Martes;Miércoles;Jueves;Viernes
08:10 - 08:50;Estenografía;Inglés;Matemática;Geografía;Matemática
08:10 - 08:50;Estenografía;15423.1259875;Matemática;Geografía;Matemática
09:00 - 09:40;Castellano;Educación Cívica;Dibujo;Física;Historia
09:40 - 10:20;Práctica Contable;Educación Cívica;Dibujo;Mecanografía;Historia
10:30 - 11:10;Química;Castellano;Física;Física;Castellano
11:10 - 11:50;Química;Práctica contable;Física;Dibujo;Castellano
11:55 - 12:35;Práctica Contable;Práctica Contable;Química;Dibujo;Inglés
El query creara una tabla:
Código:
CREATE TABLE `datosdelcsv` (
`id` INT NOT NULL auto_increment,
`Hora` TEXT NOT NULL,
`Lunes` TEXT NOT NULL,
`Martes` TEXT NOT NULL,
`Miércoles` TEXT NOT NULL,
`Jueves` TEXT NOT NULL,
`Viernes` TEXT NOT NULL,
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=14 ;
Si lo especificas a 0 entonces las columnas se llamaran Campo1,Campo2,Campo3, etc.
Ademas de poner tu necesario "flag", ahora si soporta columnas de numero variable. O sea que si falta un valor se rellena con "" (nada)
LA SEGUNDA MANO Código PHP:
<?php
/**
* Datos de MySQL
*/
$hostbd = "localhost"; /* Host MySQL */
$userbd = "root"; /* Nombre de usurio MySQL */
$passbd = "root"; /* Password de MySQL */
$bd = "basededatos"; /* Base de Datos MySQL */
$tabla = "datosdelcsv"; /* Nombre de la tabla MySQL
que se actualizará o
creará con los datos del
archivo .csv */
$ID = "id"; /* Nombre del campo index autoincremental
que se usara en la tabla creada
(o existente). Si se establece a
un valor vacio no se usaran
campos tipo ID */
$droptabla = 1; /* Si se establece a un valor
no-vacio y existe la tabla
especificada en $tabla esta
se vaciará */
/**
* Datos del archivo .csv
*/
$csv = "c:\\windows\\escritorio\\Horario Fran 2001.csv";
/* Path correspondiente al archivo .csv */
$csvconcampos = 1; /* Un valor no-vacio indica que
la primera linea del archivo .csv
contiene los nombres del las columnas. */
$delimitador = ";"; /* Delimitador que usa el archivo para
separar los campos - generalmente es ","
pero los .csv de Excel utilizan ";" */
/* Conexion a MySQL */
$l = mysql_connect($hostbd, $userbd, $passbd)
or die("<h4>No se pudo conectar a la base de datos.</h4>");
mysql_select_db($bd, $l)
or die("<h4>No se pudo seleccionar la base de datos.</h4>");
/* Apertula del archivo csv */
$csv = fopen ($csv, "r")
or die("<h4>No se pudo abrir <b>$csv</b></h4>");
/* Carga de los contenidos en un array y determina el maximo de columnas */
$maxcolumnas = 0;
while ($datos = fgetcsv ($csv, 1024*5, $delimitador)) {
$datocsv[] = $datos;
if ( count($datos) > $maxcolumnas ) {
$maxcolumnas = count($datos);
}
}
fclose ($csv);
/* Rellena las líneas con columnas incompletas */
if (!empty($csvconcampos)) {
if (count($datocsv[0]) < $maxcolumnas) {
$w = 0;
for ( $i=0; $i<$maxcolumnas; $i++ ) {
if (empty($datocsv[0][$i])) {
$datocsv[0][$i] = "Campo".++$w;
}
}
}
}
for ( $i=0; $i<count($datocsv); $i++ ) {
$datocsv[$i] = array_pad($datocsv[$i], $maxcolumnas, "");
}
/* Query para vaciado de tablas */
if (!empty($droptabla)) {
$drop = "DROP TABLE IF EXISTS `$tabla`;";
}
/* Query para determinar la existencia de la tabla */
$checkexistencia = mysql_query("SHOW TABLES FROM $bd LIKE '$tabla' ")
or die ("<pre>".mysql_error()."<pre>");
/* Si la tabla no existe (o es vaciada) confecciona el Query para crearla */
if ( mysql_num_rows($checkexistencia) == 0 || !empty($droptabla)) {
$create = "CREATE TABLE `$tabla` (";
if (!empty($ID)) {
$create .= "\n`id` INT NOT NULL auto_increment,";
}
if (!empty($csvconcampos)) {
for ($i=0; $i<count($datocsv[0]); $i++) {
$tipo = tipoMysqldata($datocsv[1][$i]);
$create .= "\n`".$datocsv[0][$i]."` $tipo NOT NULL";
if (isset($datocsv[0][$i+1])) {
$create .= ",";
}
}
$autoinc = count($datocsv);
} else {
for ($i=0; $i<count($datocsv[0]); $i++) {
$tipo = tipoMysqldata($datocsv[0][$i]);
$create .= "\n`Campo$i` $tipo NOT NULL";
if (isset($datocsv[0][$i+1])) {
$create .= ",";
}
}
$autoinc = count($datocsv)+1;
}
if (!empty($ID)) {
$create .= ",\nPRIMARY KEY (`$ID`)";
}
$create .= "\n) TYPE=MyISAM AUTO_INCREMENT=$autoinc ;";
}
/* Query para averiguar el campo index del la tabla (si esta ya existia) */
$index = @mysql_query("SHOW INDEX FROM $tabla FROM $bd");
$info = @mysql_fetch_assoc($index);
/* Condecciona un array con los Query de INSERTs */
foreach ($datocsv as $data) {
if (!empty($csvconcampos) && $check++==0) {
continue;
}
$data = array_map("mysql_real_escape_string", $data);
if ( mysql_num_rows($checkexistencia) == 0) {
if (!empty($ID)) {
$inserts[] = "INSERT INTO `$tabla` VALUES (".++$w.",'".implode("','", $data)."');";
} else {
$inserts[] = "INSERT INTO `$tabla` VALUES ('".implode("','", $data)."');";
}
} else {
if (isset($info['Cardinality'])) {
$auto = $info['Cardinality']+(++$w);
$inserts[] = "INSERT INTO `$tabla` VALUES (".$auto.",'".implode("','", $data)."');";
} else {
$inserts[] = "INSERT INTO `$tabla` VALUES ('".implode("','", $data)."');";
}
}
}
/* Muestra los querys a ejecutar */
echo "<h4>Ejecutando las siguientes consultas...</h4>\n";
echo "<pre>\n";
if (isset($drop)) {
echo "$drop<br>\n";
}
if (isset($create)) {
echo "$create<br>\n";
}
foreach ($inserts as $cu) {
echo "$cu\n";
}
echo "</pre>\n";
flush();
/* Ejecuta los Querys */
if (isset($drop)) {
if (!mysql_query($drop, $l))
echo("<b>Error:</b> al ejecutar la consulta \"$drop\".Mysql dijo:<pre>".mysql_error()."</pre><br>");
}
if (isset($create)) {
if (!mysql_query($create, $l))
echo("<b>Error:</b> al ejecutar la consulta \"$create\".Mysql dijo:<pre>".mysql_error()."</pre><br>");
}
foreach ($inserts as $cu) {
if (!mysql_query($cu, $l))
echo("<b>Error:</b> al ejecutar la consulta \"$cu\".Mysql dijo:<pre>".mysql_error()."</pre><br>");
}
/* FINAL */
echo "<h3>FINAL<h3>";
/**
* Tipo de columna MySQL
*
* Devuelve el tipo de columna MySQL
* correspondiente a una variable
* forzada como string.
*
* @param string Cadena con datos a identificar
* @return string Tipo de columna MySQL
*/
function tipoMysqldata ($string)
{
if (is_numeric($datocsv[1][$i])) {
if (substr_count($datocsv[1][$i], ".") == 1) {
$tipo = "DOUBLE";
$datocsv[1][$i] = floatval($datocsv[1][$i]);
} else {
$tipo = "INT";
$datocsv[1][$i] = intval($datocsv[1][$i]);
}
} else {
$tipo = "TEXT";
}
return $tipo;
}
?>