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: 21 años, 8 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 ($csv1024*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) == || !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;
}
?>