Ver Mensaje Individual
  #16 (permalink)  
Antiguo 02/06/2003, 04:03
fran86
 
Fecha de Ingreso: agosto-2002
Ubicación: Colón - Entre Rios - Argentina
Mensajes: 647
Antigüedad: 24 años, 2 meses
Puntos: 8
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;
}
?>