Pregunta sobre Separar Numero de Campo direccion

295 views
Skip to first unread message

emr

unread,
Oct 1, 2010, 1:06:26 AM10/1/10
to Comunidad de Visual Foxpro en Español
Hola saludos a todos

Cometí el error de no separar en el campo de la direccion de los
clientes la calle y el numero exterior e interior.

Por lo que tengo el campo direc C 120 donde estoy registrando la
calle y el numero, la pregunta es alguien ha hecho algo via código
para separar la calle del numero de este campo ? o definitvamente hay
que hacer la separación manualmente de uno en uno.

Nota: no hay un patron en la direccion por que se ha capturado de la
siguiente manera:

Calle Reforma No. 123
Reforma # 432
Juarez 981
Juarez numero 342

Saludos

Enrique Martinez
Puerto Vallarta, Jalisco México

Luis Mata

unread,
Oct 1, 2010, 3:13:37 AM10/1/10
to Comunidad de Visual Foxpro en Español
?imposible

-----Original Message-----
From: emr
Sent: Thursday, September 30, 2010 10:06 PM
To: Comunidad de Visual Foxpro en Espa�ol
Subject: [vfp] Pregunta sobre Separar Numero de Campo direccion

Hola saludos a todos

Comet� el error de no separar en el campo de la direccion de los


clientes la calle y el numero exterior e interior.

Por lo que tengo el campo direc C 120 donde estoy registrando la

calle y el numero, la pregunta es alguien ha hecho algo via c�digo


para separar la calle del numero de este campo ? o definitvamente hay

que hacer la separaci�n manualmente de uno en uno.

Nota: no hay un patron en la direccion por que se ha capturado de la
siguiente manera:

Calle Reforma No. 123
Reforma # 432
Juarez 981
Juarez numero 342

Saludos

Enrique Martinez
Puerto Vallarta, Jalisco M�xico


Odino Ciai

unread,
Oct 1, 2010, 7:43:59 AM10/1/10
to publice...@googlegroups.com
Una posibilidad es usar la funcion RAT suponiendo que siempre (o en la mayor parte de los
casos) hay un número separado por un espacio del nombre de la calle

Ejemplo

direccion="nombre de la calle 545"

posultesp=rat(alltrim(direccion)," ")

calle=alltrim(left(direccion,posultesp))
nro=alltrim(substr(direccion,posultesp))

Y despues se podría hacer una limpieza del nombre de la calle sacando los sinonimos de
#,No, numero, etc usando la funcion strtran

Con eso la mayor parte de la direcciones y números quedarian separados


Si en cambio hay un numero y piso y departamento, se complica un poco más.

Odino Ciai

od...@datamarkets.com.ar
##################################################################
Gordon's First Law:
Si un proyecto no vale la pena hacerlo,
no vale la pena hacerlo bien.


Antonio.xt

unread,
Oct 1, 2010, 9:27:00 AM10/1/10
to Comunidad de Visual Foxpro en Español

Segun los ejemplos que expones si hay un patron en la direccion, y es
calle y numero, entonces podrias semi-automatizar el proceso de
separar calle y numero en 2 campos; PERO, porque siempre va a haber un
pero en estos casos, te vas a topar con direcciones que no sigan este
patron por lo que al final vas a tener que darle una barrida manual y
verificar que las direcciones se hayan separado bien y corregir las
que no sigan el patron, por ejemplo :

Reforma # 123 sur
Reforma # 123-A
Reforma # 123 int 15

Tienes que considerar estos casos en tu proceso o al final separar a
mano la calle y el numero.

Charles Moreno
Monterrey, NL, Mexico

Arnaldo Toledano (GMail)

unread,
Oct 1, 2010, 11:21:00 AM10/1/10
to publice...@googlegroups.com
Yo hice un codigo.
NO es 100 % fiable, pero al menos un gran porcentaje paso correctamente.
Despues, obviamente, tuvieron que analizarlo.
Pero no se perdio tanto tiempo como lo hubiese sido pasar uno por uno.


Arnaldo Toledano
Cordoba
Argentina
*----------------------------------------------
Function CalcDirNro

*Obj.:Obtiene el numero de una direccion
*----------------------------------------------
Para Dire
Nro:=""
N:=M:=0
If (At("RUTA",CoPDirec)=0 .And. At("KM",Upper(CopDirec))=0)
Dire=""
For X=1 To 40
&& El campo direcion tiene 40 caracteres
If X > 6
&& Analizo el numero desde el caracter 6, hay nombre como 9 DE
N=Iif(N=0,0,N+1)
If Subs(CoPDirec,X,1) $ "0123456789."
N=If(N=0,1,N)
If N-1=M
Nro=Nro+Subs(CoPDirec,X,1)
++M
EndIf
Else
Dire=Dire+Subs(CoPDirec,X,1)
EndIf
Else
Dire=Dire+Subs(CoPDirec,X,1)
EndIf
EndFor
EndIf
_CoPDirec=Dire
Return Nro


----- Original Message -----
From: "emr" <emr9...@gmail.com>
To: "Comunidad de Visual Foxpro en Espa�ol"
<publice...@googlegroups.com>
Sent: Friday, October 01, 2010 2:06 AM
Subject: [vfp] Pregunta sobre Separar Numero de Campo direccion


Hola saludos a todos

Comet� el error de no separar en el campo de la direccion de los


clientes la calle y el numero exterior e interior.

Por lo que tengo el campo direc C 120 donde estoy registrando la

calle y el numero, la pregunta es alguien ha hecho algo via c�digo


para separar la calle del numero de este campo ? o definitvamente hay

que hacer la separaci�n manualmente de uno en uno.

Nota: no hay un patron en la direccion por que se ha capturado de la
siguiente manera:

Calle Reforma No. 123
Reforma # 432
Juarez 981
Juarez numero 342

Saludos

Enrique Martinez
Puerto Vallarta, Jalisco M�xico

__________ Informaci�n de ESET NOD32 Antivirus, versi�n de la base de firmas
de virus 5495 (20101001) __________

ESET NOD32 Antivirus ha comprobado este mensaje.

http://www.eset.com


__________ Informaci�n de ESET NOD32 Antivirus, versi�n de la base de firmas de virus 5495 (20101001) __________

ESET NOD32 Antivirus ha comprobado este mensaje.

http://www.eset.com

extremo

unread,
Oct 1, 2010, 12:00:59 PM10/1/10
to Comunidad de Visual Foxpro en Español
Todo eso puede servir pero como solucionar este tema cuando en la
direccion tenemos por ejemplo

Anibal Pinto #5214 piso 8 of. 804

Bendiciones

Templario

unread,
Oct 1, 2010, 12:37:49 PM10/1/10
to publice...@googlegroups.com

Bendiciones
* **
* Validar la Direccion
lcCalle = alltrim(tabla.Direccion)+alltrim(tabla.Direccion2)
do case
case "#"$lcCalle && Si el Numero de la calle Viene implicito dentro
de la direccion
lcNumero = alltrim(substr(lcCalle,at("#",lcCalle)+len("#")))
lcCalle = alltrim(substr(lcCalle,1,at("#",lcCalle)-1-len("#")))

case "NO."$lcCalle
lcNumero = alltrim(substr(lcCalle,at("NO.",lcCalle)+len("NO.")))
lcCalle = alltrim(substr(lcCalle,1,at("NO.",lcCalle)-1-len("NO.")))

case "NUM"$lcCalle
lcNumero = alltrim(substr(lcCalle,at("NUM",lcCalle)+len("NUM")))
lcCalle = alltrim(substr(lcCalle,1,at("NUM",lcCalle)-1-len("NUM")))

otherwise
for i = 1 to len(lcCalle)
if isdigit(substr(lcCalle,i,1))
lcNumero = alltrim(substr(lcCalle,i+1))
lcCalle = alltrim(substr(lcCalle,1,i-1))

endif
endfor
endcase
* Validar los Numeros interior y Exterior
lcNum_Int =""
lcR_Calle = proper(lcCalle)
for i = 1 to len(lcNumero)
if isalpha(substr(lcNumero,i,1))
lcNum_Int = substr(lcNumero,i)
lnPos = i-1
exit
endif
endfor
lcR_NumExt = substr(lcNumero,1,lnPos)
lcNumInt = ""
for i = 1 to len(lcNum_Int)
if isdigit(substr(lcNum_Int,i,1))
lcNumInt = lcNumInt+substr(lcNum_Int,i,1)
endif
endfor
lcR_NumInt = lcNumInt
* **

Templario

unread,
Oct 1, 2010, 12:38:15 PM10/1/10
to Comunidad de Visual Foxpro en Español

Hugo C.

unread,
Oct 1, 2010, 12:39:33 PM10/1/10
to Comunidad de Visual Foxpro en Español
checa la FUNCION STREXTRACT, pero si no
existe un "patron" creo que es muy dificil.

Saludos

Luis Mata

unread,
Oct 1, 2010, 1:00:29 PM10/1/10
to publice...@googlegroups.com
?Yo creo que a esta hora ya lo termino de separar manualmente.. jejeje

Luis

Carlos Miguel FARIAS

unread,
Oct 1, 2010, 7:19:20 PM10/1/10
to publice...@googlegroups.com
Un granito de arena...
Toma el campo dirección, separalo en un array con ALINES
Haces un bucle sobre cada elemento del array
Si el elemento es una cadena, procesar como cadena de texto (puede ser un nombre, abreviatura, simbolo u otra cosa, dependiendo de que te pasaron.
Si es un numero procesar como numero, el primer numero que aparezca puede ser el de la puerta, los siguientes, van a depender del texto inmediato anterior.
Normalmente en mi caso, guardo calle numero extension y barrio (y cod postal y ciudad), todos en campos separados.
Entonces cuando voy leyendo la dirección, asumo que mientras sea cadena lo que voy detectando en el array, eso es parte del nombre de la calle, el primer elemento numero que aparece lo mando como numero de puerta, los otros número los ubico de acuerdo a que texto haya analizado antes.
Si detecto la palabra barrio, o alguna abreviatura equivalente, pongo una bandera para indicar que los elementos siguientes los tengo que agregar al barrio (dicha palabra la quito porque es redundante).

LOCAL lcCalle, lcExtension, lcBarrio AS STRING
LOCAL liNumero AS INTEGER
STORE '' TO lcCalle, lcExtension, lcBarrio
CLEAR
SET DECIMALS TO
0
liNumero = 0
Abre_direccion( @lcCalle, @liNumero, @lcExtension, @lcBarrio , "Calle Reforma No. 123" )
? 'Calle:', lcCalle, 'Numero:', liNumero, 'Barrio:', lcBarrio, 'Extension:', lcExtension
Abre_direccion( @lcCalle, @liNumero, @lcExtension, @lcBarrio , "Reforma # 432" )
? 'Calle:', lcCalle, 'Numero:', liNumero, 'Barrio:', lcBarrio, 'Extension:', lcExtension
Abre_direccion( @lcCalle, @liNumero, @lcExtension, @lcBarrio , "Juarez 981" )
? 'Calle:', lcCalle, 'Numero:', liNumero, 'Barrio:', lcBarrio, 'Extension:', lcExtension
Abre_direccion( @lcCalle, @liNumero, @lcExtension, @lcBarrio , "Juarez numero  342" )
? 'Calle:', lcCalle, 'Numero:', liNumero, 'Barrio:', lcBarrio, 'Extension:', lcExtension
Abre_direccion( @lcCalle, @liNumero, @lcExtension, @lcBarrio , "La Mona Gimenez numero #  342 of. 328 barrio los cordobeces" )
? 'Calle:', lcCalle, 'Numero:', liNumero, 'Barrio:', lcBarrio, 'Extension:', lcExtension
Abre_direccion( @lcCalle, @liNumero, @lcExtension, @lcBarrio , "23 de Febrero 342 Piso 3 Dpto. 4 Ba. Villa Tachito" )
? 'Calle:', lcCalle, 'Numero:', liNumero, 'Barrio:', lcBarrio, 'Extension:', lcExtension

FUNCTION Abre_direccion( tcCalle AS STRING, tiNumero AS INTEGER, tcExtension AS STRING, tcBarrio  AS STRING, tcDireccion AS STRING ) AS STRING
    LOCAL li, liN, liQ AS INTEGER
    LOCAL llBarrio, llCalle AS BOOLEAN
    LOCAL ARRAY la[1]
    STORE '' TO tcCalle, tcExtension, tcBarrio
    tiNumero = 0
    STORE .F. TO llBarrio, llNumero
    NOTE: despanzurra la direccion en sus partes, 5 es PARA eliminar partes vacias (que serían dobles espacios en blancos)
    liQ = ALINES( la, tcDireccion, 5, ' ' )
    NOTE: el 1° ITEM considero que es parte de la calle (Y de paso me carga el numero de una calle que sea una fecha ej. 25 de MAYO, 9 de JULIO
    llCalle = .T. && Asumo que la calle va primero, y empiezo a cargarla hasta que aparezca un numero
    tcCalle = la[1]
    FOR li = 2 TO liQ          && El 1°, ya lo cargue antes.
        liN = VAL( la[li] )        && Obtengo valor numerico del elemento, si no es numero, guarda cero
        DO CASE
            CASE
    liN>0 AND tiNumero==0    && si elemento es numero, y numero no cargado,...
                tiNumero = liN                    && ... lo guarda como numero de puerta.
                llCalle = .F.                    && Si cargo numero, ya no esta en calle
            CASE    INLIST( UPPER( la[li] ), 'NUMERO', '#', 'NO', 'NO.' )        && Detecto si empieza menciona numero, agregar variantes
                llCalle = .F.                    && ...por lo tanto, ya no esta en calle
            CASE    INLIST( UPPER( la[li] ), 'BARRIO', 'BA.', 'BRO' )    && Detecto si empieza barrio, agregar variantes
                llBarrio = .T.                    && Indica que empezo barrio...
                llCalle = .F.                    && ...por lo tanto, ya no esta en calle
            CASE    llCalle                        && Carga en calle.
                tcCalle = IIF( EMPTY( tcCalle ), '', tcCalle + ' ' ) + la[li]
            CASE    llBarrio                        && Carga en Barrio
                tcBarrio = IIF( EMPTY( tcBarrio ), '', tcBarrio + ' ' ) + la[li]
            OTHERWISE                            && cualquier otra cosa, la poner en extension
                tcExtension = IIF( EMPTY( tcExtension ), '', tcExtension + ' ' ) + la[li]
        ENDCASE
    ENDFOR
ENDFUNC


Este ejemplo funciona, te da una idea como trabajar, si tenes metidos departamento, pisos, etc. es cuestion de ir agregando "banderas" (llCalle, etc.) y salidas por el case, fijate que las palabras que demarcan barrio, numero, etc. se quitan, porque van a campos especificos.
Lo importante en este caso es que el resultado se devuelve en variables por referencia.
Buen Provecho

2010/10/1 Luis Mata <lm...@cclf.com.pe>
1E3.gif
35E.png
4F4.gif
1B2.png
361.gif

Enrique Martinez

unread,
Oct 4, 2010, 12:22:08 AM10/4/10
to publice...@googlegroups.com
Agradezco a todos sus comentarios, voy a ponerlos en practica para ver cual me resulta mas rápido.

Saludos a todos y muchas gracias.

Enrique Martinez
1E3.gif
35E.png
4F4.gif
1B2.png
361.gif
Reply all
Reply to author
Forward
0 new messages