Hola
Tengo unas tablas en .dbf y me gustaria de manera automatica insertar el contenido en tablas con los mismo campos pero en mysql , existe alguna manera de hacerlo?
Gracias de antemano
paloclanweb
| |||
dbf a mysql mediante php Hola Tengo unas tablas en .dbf y me gustaria de manera automatica insertar el contenido en tablas con los mismo campos pero en mysql , existe alguna manera de hacerlo? Gracias de antemano paloclanweb |
| |||
Tiene que ser un script en PHP que haga ese proceso regulamente? .. o podría ser una aplicación (GUI) que lo haga (tu lo tendrías que hacer como "administrador")? Te hago el comentario por qué existen muchos GUI's que permiten conectarte a diferentes BD (por ODBC la mayoría) y así por otro lado conectarte a Mysql para hacer todo tipo de replicamientos, trasnferencias y sincronizaciones. Por ejemplo .. usa google "dbf to mysql" veras muchas propuestas. Un saludo, |
| |||
Mira la idea es que me llegan a manera de ficheros, tres tablas que desconozco todavia el formato pero son parte de una BD Foxpro(por eso supongo que sean .dbf) y mi objetivo es leerlas e incorporar sus datos en tablas que son identicas(los mismos campos) en mysql, de todas maneras voy a probar la variante que me planteas de replicar mediante una GUI Muchas gracias..voy a intertalo Saludos |
| |||
Si lo quieres hacer con PHP .. tendrías que usar ODBC (www.php.net/odbc) crear tu DSN de sistema (apuntando a tu BD FoxPro), eso por un lado .. luego usar las funciones de Mysql para conectarte a ella e ir traspasando registro a registro entre ambas BD ... Un saludo, |
| |||
Cluster Mi interes era lograr trabajar directamente con un fichero dbf y mediante una herramienta vieja, el XtreeGold logre captar el ascii que me brinda informacion sobre el comienzo de los datos, el numero de campos , la longitud de los campos, ect..usando esto logre captar toda la informacion del dbf, ahora teniendo un arreglo de los datos es facil pasarla a una tabla en mysql, aqui te pongo el script, pruebalo y dime que te parece Saludos Paloclanweb <? $fp = fopen("C:\a\XAC_SIST.dbf",r); $cascara=fgets($fp,5);//mE MUEVO HASTA EL BYTE 5 Y TODA ESA CASCARA LEIDA NO LA USO $cant=fgets($fp,5);//Leo 4 Bytes desde la posicion 5 este me dice la cantidad de articulos del dbf $CantArticulos=DameNumero($cant);//Cantidad de Articulos $cant=fgets($fp,3);//Leo 2 Bytes desde la posicion 11 Inicio de Datos,Ojo recordar que siempre es cantidad Leer + 1 $InicioDatos=DameNumero($cant);//Me da el byte donde empiezan los datos $cant=fgets($fp,5);//Leo 4 Bytes desde la posicion 14 Longitud del articulo, la suma de los caracteres predefinidos de toso los campos. $LongArticulo=DameNumero($cant);//Me da la longitud total del articulo $cascara=fgets($fp,19);//me posiciono en el primer campo $listado=array(); $CantidadCampos=ContarCampos($fp,$LongArticulo,$li stado); $diferencia=($InicioDatos-gztell($fp))+1;//gztell me dice donde esta actualmente el puntero if ($diferencia >1 ) { $cascara=$fgets($fp,$diferencia); //Leer desde donde esta actualmente el puntero hasta donde debe de empezar los datos y esa difrenecia es la que debo leer //ya tengo el puntero al inicio de los datos }//si no es diferente de 1 es porque el puntero esta donde me interesa //aqui logro exponer la informacion indexada, en fila, clolumna //lo que me permite agarrarlo y tirar cada dato por separadao para donde quiera for ($i=1; $i <= $CantArticulos ; $i++) { $linea=fgets($fp,$LongArticulo); echo $i.') '.$linea.'<br>'; for ($m=1 ; $m<=$CantidadCampos ; $m++) { $fila[$i][$m]=substr($linea,$listado[$m]['Pos'],$listado[$m]['Long']); echo '----- '.$m.' ----- '.$fila[$i][$m]."<br>"; } echo '<br>'; } fclose($fp); exit(); //************************************************** ************* function DameNumero ($cant1) //************************************************** ************* { $pila=""; For($j=strlen($cant1); $j>=1 ;$j--) { $byte=substr($cant1,$j-1,1);//Agarro Byte por Byte $pila=$pila.dechex(ord($byte));//Cada uno lo llevo de ASCII a decimal y luego a hex y los voy concatenando } return $pila=hexdec($pila);//Los llevo a decimal } //************************************************** ************* function ContarCampos($fp,$LongArticulo,&$listado) //************************************************** ************* { $stop=false; While (!$stop) { $campos=fgets($fp,2);//leo el primer campo $Caracter1=ord(substr($campos,0,1));//lo llevamos a ascii if ($Caracter1==13)//13 es el ascii de 0D que es el valor del byte que indica que se acabaron los campos { $stop=true; $listado[$a+1]['Pos']=$LongArticulo;//la ultima posicion que la asumo como la longitud total for ($j=1; $j<=$a ; $j++) { $listado[$j]['Long']=$listado[$j+1]['Pos'] - $listado[$j]['Pos']; echo $listado[$j]['Long'].'<br>'; } return $a; } else { $campos=$campos.fgets($fp,32);//leo el primer campo, los campos van de 32 en 32 bytes $NombreCampo=substr($campos,0,10); $TipodeCampo=substr($campos,11,1); $PosicionenBytesdelArticulo=ord(substr($campos,12, 1)); $a++; $listado[$a]['Pos']=$PosicionenBytesdelArticulo; $listado[$a]['NombreCampo']=$NombreCampo; } } } ?> |
| |||
No tengo oportunidad de probarlo .. pero si funciona, te invito a que realizes una FAQ'a al respecto indicando tus esperiencias con el tema y el código que propones .. así nos servirá a todos por si lo necesitamos. Un saludo, |
| |||
Cita: Me refería simplemente a las FAQ's de este foro PHP por el momento, aquí .. en este mensaje:
Iniciado por paloclanweb Ok... el codigo lo mejore, por ejemplo la funcion fgets me paraba en los cambios de linea.Acabo de entrar a Faqs del Web, gracias por tu sugerencia. Saludos paloclanweb http://www.forosdelweb.com/showthread.php?t=101546 Ahí simplemente publica tu mensaje nuevo (en ese mensaje) con el formato que veras de otras FAQ's ahí mencionadas (o indicaciones del primer mensaje) .. así quedará bajo tu usuario por si alguien gusta de hacerte preguntas o agradecimientos. Un saludo, |