Foros del Web » Programando para Internet » PHP »

archivo csv php mysql

Estas en el tema de archivo csv php mysql en el foro de PHP en Foros del Web. como inserto un archivo csv a mysql con php, debo leerlo linea por linea y cada linea enviarla a una tabla distinta de la base ...
  #1 (permalink)  
Antiguo 18/04/2012, 13:25
 
Fecha de Ingreso: abril-2012
Mensajes: 58
Antigüedad: 12 años
Puntos: 0
archivo csv php mysql

como inserto un archivo csv a mysql con php, debo leerlo linea por linea y cada linea enviarla a una tabla distinta de la base de datos.
mi base es:

cod nombre identificacion ene feb
1 andres 12345
1 sueldo 500 400
2 ahorro 20 30

2 carlos 3214
1 sueldo 300 600
2 ahorro 20 10

la base esta asi y quisiera que quedara asi
nombre identificación sueldo ahorro fecha
andres 12345 500 20 ene
andres 12345 400 30 feb
carlos 3214 300 20 ene
crlos 3214 600 10 feb

y son mas de 5mil registros que estan asi sucesivamente no se como pasar esos datos por favor necesito ayuda con esto.
nota: no soy muy bueno para el excel me dicen q con una macro pero la verdad no se q hacer.
gracias por su ayuda.
  #2 (permalink)  
Antiguo 18/04/2012, 14:24
Avatar de linuxzero  
Fecha de Ingreso: noviembre-2011
Ubicación: Argentina
Mensajes: 778
Antigüedad: 12 años, 5 meses
Puntos: 160
Respuesta: archivo csv php mysql

En el csv seguramente tengas un caracter que te defina el fin de la fila, y otro caracter que te defina el fin de cada campo.

Lo que vas a tener que hacer es leer el csv, con file_get_contents() y meterlo en una variable asi:

Código PHP:
Ver original
  1. $contenido = file_get_contents("RUTA_AL_ARCHIVO");

Luego en $contenido vas a tener todo el contenido del archivo, ahora solo falta realizar el explode() del $contenido para que te divida el contenido en posiciones de un vector segun un caracter.
Un ejemplo de su uso seria asi:

Código PHP:
Ver original
  1. $filas = explode(";", $contenido);

La primera vez que hagas el explode va a ser para dividir las filas, asi el vector del contenido te quedaria asi:

Código PHP:
Ver original
  1. $filas[0] = fila1;
  2. $filas[1] = fila2;
  3. $filas[2] = fila3;
  4. ....
  5. $filas[n] = filaN;

y vas a tener que recorrer ahora ese vector para que por cada fila realices un nuevo explode() para obtener cada campo, que seria algo asi:

Código PHP:
Ver original
  1. foreach ($filas as $fila) {
  2.      $campos = explode("|||", $fila);
  3. }

Ahora por cada iteracion de las filas tendrias un vector de la forma siguiente:

Código PHP:
Ver original
  1. $campos[0] = campo1;
  2. $campos[1] = campo2;
  3. $campos[2] = campo3;
  4. ....
  5. $campos[n] = campoN;

Donde cada $campo[x] seria un valor de cada campo de tu tabla en la base de datos.

Resumido es asi, puede que tengas que aplicar alguna logica mas compleja, pero no escapa de esto.
__________________
Si todo fuera tan sencillo como un symfony cc la vida seria más fácil.
http://phpnico.wordpress.com
  #3 (permalink)  
Antiguo 19/04/2012, 08:17
 
Fecha de Ingreso: abril-2012
Mensajes: 58
Antigüedad: 12 años
Puntos: 0
Respuesta: archivo csv php mysql

hola linuxzero primero q todo muchas gracias por tu respuesta,yo ya tengo este codigo y me inserta el archivo csv

<?php
//se tiene el archivo que se subio
foreach($_FILES as $campo => $texto)
eval("\$".$campo."='".$texto."';");
//se accede al archivo por Files
?>
<table align="center">
<tr>
<td>
<b>Nombre:</b>: <?php echo $_FILES["archivo"]["name"]?>

<b>Tipo:</b>: <?php echo $_FILES["archivo"]["type"]?>

<b>Subida:</b>: <?php echo ($_FILES["archivo"]["error"]) ? "Incorrecta" : "Correcta"?>

<b>Tamaño:</b>: <?php echo $_FILES["archivo"]["size"]?> bytes
</td>
</tr>
</table>


<?php
function Conectarse() //Función para conectarse a la BD
{
if (!($link=mysql_connect("localhost","root",""))) { //Cambia estos datos
echo "Error conectando a la base de datos.";
exit();
}
if (!mysql_select_db("recursoshumanos",$link)) {
echo "Error seleccionando la base de datos.";
exit();
}
return $link;
}
//si se envio y se subio correctamente
if (isset($_FILES["archivo"]) && is_uploaded_file($_FILES['archivo']['tmp_name']))
{
$row = 0;
//lo abro en modo lectura
$fp = fopen($_FILES['archivo']['tmp_name'], "r");
//lo abro y lo vectorizo a data
while (!feof($fp))
{

//lo lee separado por tabulacion
//$data = explode(" ", fgets($fp));
//lo lee separado por punto y coma
$data = explode(";", fgets($fp));
foreach ($data as $data) {
$campos = explode("|||", $data);
}

$num = count($data); //Cuenta cuantos campos contiene la linea (el array 'data')
$row++;
$cadena = "insert into dato(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) values("; //Cambia los valores 'CampoX' por el nombre de tus campos de tu tabla y colócales los necesarios
for ($c=0; $c < $num; $c++)
{ //Aquí va colocando los campos en la cadena, si aun no es el último campo, le agrega la coma (,) para separar los datos
if ($c==($num -1))
$cadena = $cadena."'".$data[$c] . "'";
else
$cadena = $cadena."'".$data[$c] . "',";
}

$cadena = $cadena. ");"; //Termina de armar la cadena para poder ser ejecutada $cadena = $cadena.
echo $cadena."<br>"; //Muestra la cadena para ejecutarse
$enlace=Conectarse();
$result=mysql_query($cadena, $enlace); //Aquí está la clave, se ejecuta con MySQL la cadena del insert formada
mysql_close($enlace);


//lee el ducumento completo
var_dump($data);
//se imprime un solo dato
echo "<br/>Imprimir el primer dato solo: {$data[0]}<br/>";

//ojo cada vuelta devuleve un linea completa de cvs
}
//muestra si el a r chivo fue recorrido
echo "Archivo recorrido";
} else
echo "Error de subida";
?>

como realizaría el insert??
  #4 (permalink)  
Antiguo 19/04/2012, 08:26
Avatar de linuxzero  
Fecha de Ingreso: noviembre-2011
Ubicación: Argentina
Mensajes: 778
Antigüedad: 12 años, 5 meses
Puntos: 160
Respuesta: archivo csv php mysql

No entendi, te inserta bien en la base o no?
__________________
Si todo fuera tan sencillo como un symfony cc la vida seria más fácil.
http://phpnico.wordpress.com
  #5 (permalink)  
Antiguo 19/04/2012, 08:48
 
Fecha de Ingreso: abril-2012
Mensajes: 58
Antigüedad: 12 años
Puntos: 0
Respuesta: archivo csv php mysql

No ing a ver el problema es q tengo ese insert pero no me inserta los datos a la base de datos, como hago el insert para tomar cada campo y direccionarlo al campo corespondiente en la la tabla de la base de datos.
  #6 (permalink)  
Antiguo 19/04/2012, 08:52
Avatar de linuxzero  
Fecha de Ingreso: noviembre-2011
Ubicación: Argentina
Mensajes: 778
Antigüedad: 12 años, 5 meses
Puntos: 160
Respuesta: archivo csv php mysql

Cuando haces el echo de $cadena, que te muestra? postea eso para ver si hay algun error de sintaxis, sino hace s esta parte:

Código PHP:
Ver original
  1. $result=mysql_query($cadena, $enlace); //Aquí está la clave, se ejecuta con MySQL la cadena del insert formada

agregale un mysql_error() asi:

Código PHP:
Ver original
  1. $result=mysql_query($cadena, $enlace) or die(mysql_error()); //Aquí está la clave, se ejecuta con MySQL la cadena del insert formada

Para saber que error esta devolviendo en caso de que tengas error.
__________________
Si todo fuera tan sencillo como un symfony cc la vida seria más fácil.
http://phpnico.wordpress.com
  #7 (permalink)  
Antiguo 19/04/2012, 09:00
 
Fecha de Ingreso: abril-2012
Mensajes: 58
Antigüedad: 12 años
Puntos: 0
Respuesta: archivo csv php mysql

con el echo de cadena me muestra lo siguiente en pantalla

Nombre:: INGYRETTOTALES2010 (Autoguardado).csv Tipo:: application/vnd.ms-excel Subida:: Correcta Tamaño:: 702156 bytes
insert into dato(Cod,empledo,Esta,Cedu,Tot,Ene,Febre,Mar,Abr,M ay,Jun,Jul,Agos,Septiem,Octu,Nom,Diciem) values('DIC ');


array
0 => string 'DIC

' (length=5)

Imprimir el primer dato solo: DIC
insert into dato(Cod,empledo,Esta,Cedu,Tot,Ene,Febre,Mar,Abr,M ay,Jun,Jul,Agos,Septiem,Octu,Nom,Diciem) values(' ');
array
0 => string '

' (length=2)

Imprimir el primer dato solo:
insert into dato(Cod,empledo,Esta,Cedu,Tot,Ene,Febre,Mar,Abr,M ay,Jun,Jul,Agos,Septiem,Octu,Nom,Diciem) values('0 ');
array
0 => string '0

' (length=3)

Imprimir el primer dato solo: 0
insert into dato(Cod,empledo,Esta,Cedu,Tot,Ene,Febre,Mar,Abr,M ay,Jun,Jul,Agos,Septiem,Octu,Nom,Diciem) values('0 ');
array
0 => string '0

' (length=3)

Imprimir el primer dato solo: 0
insert into dato(Cod,empledo,Esta,Cedu,Tot,Ene,Febre,Mar,Abr,M ay,Jun,Jul,Agos,Septiem,Octu,Nom,Diciem) values('0 ');
array





al agregar el mysql_error
imprime esto.....

Nombre:: INGYRETTOTALES2010 (Autoguardado).csv Tipo:: application/vnd.ms-excel Subida:: Correcta Tamaño:: 702156 bytes
insert into dato(Cod,empledo,Esta,Cedu,Tot,Ene,Febre,Mar,Abr,M ay,Jun,Jul,Agos,Septiem,Octu,Nom,Diciem) values('DIC ');
Column count doesn't match value count at row 1
  #8 (permalink)  
Antiguo 19/04/2012, 09:15
Avatar de linuxzero  
Fecha de Ingreso: noviembre-2011
Ubicación: Argentina
Mensajes: 778
Antigüedad: 12 años, 5 meses
Puntos: 160
Respuesta: archivo csv php mysql

Asegurate que estes haciendo bien el explode porque al recorrer $datos en el for, no estas recuperando bien los datos al parecer cuando formulas el sql en $cadena.
__________________
Si todo fuera tan sencillo como un symfony cc la vida seria más fácil.
http://phpnico.wordpress.com
  #9 (permalink)  
Antiguo 19/04/2012, 09:46
 
Fecha de Ingreso: abril-2012
Mensajes: 58
Antigüedad: 12 años
Puntos: 0
Respuesta: archivo csv php mysql

mira le quite el
foreach ($filas as $fila) {
$campos = explode("|||", $fila);
}

y me imprime lo siguiente por pantalla:

Imprimir el primer dato solo: COD
insert into dato(Cod,empledo,Esta,Cedu,Tot,Ene,Febre,Mar,Abr,M ay,Jun,Jul,Agos,Septiem,Octu,Nom,Diem) values('1','CENTENO SANCHEZ JENNYFER CAROLINA *R*','Retirado','1018414906','','','','','','','', '','','','','',' ');
array
0 => string '1' (length=1)
1 => string 'CENTENO SANCHEZ JENNYFER CAROLINA *R*' (length=37)
2 => string 'Retirado' (length=8)
3 => string '1018414906' (length=10)
4 => string '' (length=0)
5 => string '' (length=0)
6 => string '' (length=0)
7 => string '' (length=0)
8 => string '' (length=0)
9 => string '' (length=0)
10 => string '' (length=0)
11 => string '' (length=0)
12 => string '' (length=0)
13 => string '' (length=0)
14 => string '' (length=0)
15 => string '' (length=0)
16 => string '

' (length=2)

Imprimir el primer dato solo: 1
insert into dato(Cod,empledo,Esta,Cedu,Tot,Ene,Febre,Mar,Abr,M ay,Jun,Jul,Agos,Septiem,Octu,Nom,Diem) values('2','HONORARIOS','','','2.475.000,00','0',' 550.000,00','550.000,00','550.000,00','550.000,00' ,'275.000,00','0','0','0','0','0','0 ');
array
0 => string '2' (length=1)
1 => string 'HONORARIOS' (length=10)
2 => string '' (length=0)
3 => string '' (length=0)
4 => string '2.475.000,00' (length=12)
5 => string '0' (length=1)
6 => string '550.000,00' (length=10)
7 => string '550.000,00' (length=10)
8 => string '550.000,00' (length=10)
9 => string '550.000,00' (length=10)
10 => string '275.000,00' (length=10)
11 => string '0' (length=1)
12 => string '0' (length=1)
13 => string '0' (length=1)
14 => string '0' (length=1)
15 => string '0' (length=1)
16 => string '0

' (length=3)

Imprimir el primer dato solo: 2
insert into dato(Cod,empledo,Esta,Cedu,Tot,Ene,Febre,Mar,Abr,M ay,Jun,Jul,Agos,Septiem,Octu,Nom,Diem) values('66','AHORRO VOLUNTARIO','','','16.500,00','0','16.500,00','0', '0','0','0','0','0','0','0','0','0 ');
array
0 => string '66' (length=2)
1 => string 'AHORRO VOLUNTARIO' (length=17)
2 => string '' (length=0)
3 => string '' (length=0)
4 => string '16.500,00' (length=9)
5 => string '0' (length=1)
6 => string '16.500,00' (length=9)
7 => string '0' (length=1)
8 => string '0' (length=1)
9 => string '0' (length=1)
10 => string '0' (length=1)
11 => string '0' (length=1)
12 => string '0' (length=1)
13 => string '0' (length=1)
14 => string '0' (length=1)
15 => string '0' (length=1)
16 => string '0

' (length=3)


en el primer array muestra el nombre y la cedula, en el segundo array muestra los honorarios q recibió por todo el año desde el campo 5 que es enero, los campos q están vacíos son campos q se encuentran vacíos en el csv, en el siguiente es un descuento de un ahorro q hacen y lo mismo desde el campo 5 empieza desde el mes de enero y llega hasta el campo 16 q vendría siendo diciembre, como hago para q cada item ahorro y honorario lo guarde en mi base de datos asi:
nombre|cedula|honorario|ahorro
luz.......|123.....|500.........|20....
  #10 (permalink)  
Antiguo 19/04/2012, 10:03
Avatar de linuxzero  
Fecha de Ingreso: noviembre-2011
Ubicación: Argentina
Mensajes: 778
Antigüedad: 12 años, 5 meses
Puntos: 160
Respuesta: archivo csv php mysql

No veo que el sql este mal formado ahora. No se entiende la problematica de ahora.
__________________
Si todo fuera tan sencillo como un symfony cc la vida seria más fácil.
http://phpnico.wordpress.com
  #11 (permalink)  
Antiguo 19/04/2012, 10:27
 
Fecha de Ingreso: abril-2012
Mensajes: 58
Antigüedad: 12 años
Puntos: 0
Respuesta: archivo csv php mysql

cada array es una fila, y al insertar quedaria asi y la base de datos esta asi, por eso al subir el archivo csv las columnas quedan asi
cod| nombre |identificacion ene |feb
1 |andres |12345 | |
1 |sueldo | |500 |400
2 |ahorro | |20 |30

2 carlos 3214
1 sueldo 300 600
2 ahorro 20 10

donde cod, nombre, identifacion, ene, feb quedan como el nombre de los campos en la base de datos.

y yo quiero q los campos de la base de datos quede
nombre|cedula|honorario|ahorro
luz.......|123.....|500.........|20....
  #12 (permalink)  
Antiguo 19/04/2012, 11:18
Avatar de linuxzero  
Fecha de Ingreso: noviembre-2011
Ubicación: Argentina
Mensajes: 778
Antigüedad: 12 años, 5 meses
Puntos: 160
Respuesta: archivo csv php mysql

Ahh ya entendi, bueno ahi tendras que aplicar la logica para saber discriminar cada posicion del vector para que encaje, eso ya depende de vos. Si hiciste bien los 2 explode ya despues es cosa de ver como usar los datos.
__________________
Si todo fuera tan sencillo como un symfony cc la vida seria más fácil.
http://phpnico.wordpress.com

Etiquetas: csv, mysql, registro, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:37.