Ver Mensaje Individual
  #5 (permalink)  
Antiguo 13/09/2005, 07:15
paloclanweb
 
Fecha de Ingreso: marzo-2005
Mensajes: 116
Antigüedad: 19 años, 1 mes
Puntos: 1
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;

}
}
}

?>