[VFP] Buscar texto en una cadena de atraz hacia adelante

9,310 views
Skip to first unread message

ZeRoberto

unread,
Sep 5, 2012, 10:20:07 PM9/5/12
to publicesvfoxpro
Existe alguna funcion que me permita buscar una texto en una cadena pero que empieze de la ultima palaba hasta la primera?
 
Saludos

Hugo C.

unread,
Sep 5, 2012, 10:39:06 PM9/5/12
to publice...@googlegroups.com
Una de las cosas mas "poderosas" que tiene VFP
tal vez te sirva;

Saludos.

edgar suarez kummers

unread,
Sep 5, 2012, 10:44:26 PM9/5/12
to publice...@googlegroups.com
Primero le das la voltereta:

*delante es la cadena para adelante.
*patras es la cadena invertida.

largo = len(delante)
patras = ""
for indio = largo to 1 step -1
inter = right(delante,indio)
sirve = left(inter,1)
patras = patras + sirve
endfor

*patras = la cadena invertida

ahora sí busca como quieras

 

El 5 de septiembre de 2012 21:20, ZeRoberto <zero...@gmail.com> escribió:
Existe alguna funcion que me permita buscar una texto en una cadena pero que empieze de la ultima palaba hasta la primera?
 
Saludos

--
 
 
 



--

edgar suarez kummers

Fox Learner

unread,
Sep 5, 2012, 11:45:02 PM9/5/12
to publice...@googlegroups.com
Si se trata de buscar palabras completas, revise la ayuda de estas 2 funciones disponibles según observo desde VFP8.

GETWORDNUM(cString, nIndex[, cDelimiters])
GetWordCount(cString[, cDelimiters])

Creo que lo de empezar al reves lo solucionará con algún truco.

Saludos!


Víctor Hugo Espínola Domínguez

unread,
Sep 5, 2012, 11:46:47 PM9/5/12
to publice...@googlegroups.com
Hola ZeRoberto

b="xy"
c="axygxyhjhxysd"
? AT( b, c, OCCURS( b, c ) )

Saludos.
Víctor.

El 5 de septiembre de 2012 22:20, ZeRoberto <zero...@gmail.com> escribió:
Existe alguna funcion que me permita buscar una texto en una cadena pero que empieze de la ultima palaba hasta la primera?
 
Saludos

--
 
 
 

Pablo Daniel Lissa

unread,
Sep 6, 2012, 8:08:10 AM9/6/12
to publice...@googlegroups.com
Yo lo haría con el método RAT. Un ejemplo con una frase de Les Luthiers (grupo humorístico argentino):

texto = "Algunos beduinos provenían de ciertos oasis poblados, y otros, de ciertos desiertos desiertos"
cadenaABuscar = "ciertos"
FOR i = 1 TO OCCURS(cadenaABuscar, texto)
    ?RAT(cadenaABuscar, texto, i)
ENDFOR

Según el caso, convendría trabajar con las cadenas de caracteres pasadas a mayúsculas o minúsculas para que la búsqueda sea case insensitive.

Saludos.
-----------------------------------------------------------------------------------------------------------------------------

Mario López

unread,
Sep 6, 2012, 8:33:51 AM9/6/12
to publice...@googlegroups.com
@Pablo: jajaja, me hiciste acordar del acto ese de Les Luthiers (Serenata Medio Oriental), es buenísimo:

http://www.youtube.com/watch?v=3I5SgmPfKgs

Saludos,
Mario

---

Pablo Daniel Lissa

unread,
Sep 6, 2012, 8:51:21 AM9/6/12
to publice...@googlegroups.com
Sí, son geniales. Me gusta mucho esa obra (Grandes Hitos). En realidad me gustan todas sus obras, y su frase me sirvió para el ejemplo. Jajaja.

Otra de ese tipo de frases: "Quien conociera a María, amaría a María". También hubiese servido para el ejemplo. Jajaja.

Saludos.

ZeRoberto

unread,
Sep 6, 2012, 12:26:38 PM9/6/12
to publice...@googlegroups.com
El Visual Foxpro Solo te permite buscar cadenas desde la posicion 0
hasta la longitud de la cadena, mas no de una posicion dada o de atras
adelante.

Gracias a todos ya lo resolvi tuve que hacerle un ALINES y luego
buscar de atras padelante y luego sumar la longitudes de cada palabra
mas un espacio en blanco.

Saludos

El 06/09/12, Pablo Daniel Lissa <pablo.dan...@gmail.com> escribió:
> --
>
>
>
>

Pablo Daniel Lissa

unread,
Sep 6, 2012, 12:36:22 PM9/6/12
to publice...@googlegroups.com
Hola Roberto:

Me alegro que hayas resuelto el problema, aunque quedé un poco confundido. Si podés poner un ejemplo del problema te lo agradecería. Tal vez haya alguna opción usando SUBSTR o algo por el estilo.

Éxitos. Saludos.
-------------------------------------------------------------------------------------------------------------------------------------

ZeRoberto

unread,
Sep 6, 2012, 12:49:40 PM9/6/12
to publice...@googlegroups.com
lcStrings = "Uno Dos Tres Cuatro Cinco Tres"
lnPos = StrFind("Tres", lcStrings)

? lcStrings
? Substr(lcStrings, lnPos)

Function StrFind(tcWord, tcString)
Local lnCount, lnItem, lnFound, lnPosition
Dimension laWords[1]
lnCount = Alines(laWords, tcString, 9, " ")
lnFound = 0
For lnItem = lnCount To 1 Step -1
If tcWord = laWords[lnItem]
lnFound = lnItem
Exit
EndIf
EndFor
lnPosition = 0
For lnItem = 1 To lnFound - 1
lnPosition = lnPosition + Len(laWords[lnItem]) + 1
EndFor
If lnFound > 0
lnPosition = lnPosition + 1
EndIf
Return (lnPosition)

El 06/09/12, Pablo Daniel Lissa <pablo.dan...@gmail.com> escribió:
> Hola Roberto:
>
> Me alegro que hayas resuelto el problema, aunque quedé un poco confundido.
> Si podés poner un ejemplo del problema te lo agradecería. Tal vez haya
> alguna opción usando SUBSTR o algo por el estilo.
>
> Éxitos. Saludos.
> -------------------------------------------------------------------------------------------------------------------------------------
>
> El jueves, 6 de septiembre de 2012 13:26:45 UTC-3, Roberto Reátegui
> Kanashiro escribió:
>>
>> El Visual Foxpro Solo te permite buscar cadenas desde la posicion 0
>> hasta la longitud de la cadena, mas no de una posicion dada o de atras
>> adelante.
>>
>> Gracias a todos ya lo resolvi tuve que hacerle un ALINES y luego
>> buscar de atras padelante y luego sumar la longitudes de cada palabra
>> mas un espacio en blanco.
>>
>> Saludos
>>
>> El 06/09/12, Pablo Daniel Lissa <pablo.dan...@gmail.com <javascript:>>
> --
>
>
>
>

ZeRoberto

unread,
Sep 6, 2012, 12:51:48 PM9/6/12
to publice...@googlegroups.com
Aunque con OCCURS Tambien se lo pudo haber sacado. Los hice asi para
asegurarme de que este correcto.

Saludos

El 06/09/12, ZeRoberto <zero...@gmail.com> escribió:

Pablo Daniel Lissa

unread,
Sep 6, 2012, 1:02:43 PM9/6/12
to publice...@googlegroups.com
Con el ejemplo quedó claro. ¿No te sirve lo siguiente?

lcStrings = "Uno Dos Tres Cuatro Cinco Tres Seis"
? Substr(lcStrings, RAT("Tres", lcStrings))

Éxitos. Saludos.
----------------------------------------------------------------------------------------------------------------------

ZeRoberto

unread,
Sep 6, 2012, 1:04:45 PM9/6/12
to publice...@googlegroups.com
Creo que mas facil sale asi, pero hay que asegurarse de que la palabra se entera

lcStrings = "Uno Dos Tres Cuatro Cinco Tres"
lnPos = at("Tres", lcStrings, OCCURS("Tres", lcStrings))

? lcStrings
? SUBSTR(lcStrings, lnPos)

El 06/09/12, Pablo Daniel Lissa <pablo.dan...@gmail.com> escribió:
> Con el ejemplo quedó claro. ¿No te sirve lo siguiente?
>
> lcStrings = "Uno Dos Tres Cuatro Cinco Tres Seis"
> ? Substr(lcStrings, RAT("Tres", lcStrings))
>
> Éxitos. Saludos.
> ----------------------------------------------------------------------------------------------------------------------
>
> El jueves, 6 de septiembre de 2012 13:51:52 UTC-3, Roberto Reátegui
> Kanashiro escribió:
>>
>> Aunque con OCCURS Tambien se lo pudo haber sacado. Los hice asi para
>> asegurarme de que este correcto.
>>
>> Saludos
>>
>> El 06/09/12, ZeRoberto <zero...@gmail.com <javascript:>> escribió:
>> > lcStrings = "Uno Dos Tres Cuatro Cinco Tres"
>> > lnPos = StrFind("Tres", lcStrings)
>> >
>> > ? lcStrings
>> > ? Substr(lcStrings, lnPos)
>> >
>> > Function StrFind(tcWord, tcString)
>> > Local lnCount, lnItem, lnFound, lnPosition
>> > Dimension laWords[1]
>> > lnCount = Alines(laWords, tcString, 9, " ")
>> > lnFound = 0
>> > For lnItem = lnCount To 1 Step -1
>> > If tcWord = laWords[lnItem]
>> > lnFound = lnItem
>> > Exit
>> > EndIf
>> > EndFor
>> > lnPosition = 0
>> > For lnItem = 1 To lnFound - 1
>> > lnPosition = lnPosition + Len(laWords[lnItem]) + 1
>> > EndFor
>> > If lnFound > 0
>> > lnPosition = lnPosition + 1
>> > EndIf
>> > Return (lnPosition)
>> >
>> > El 06/09/12, Pablo Daniel Lissa <pablo.dan...@gmail.com <javascript:>>
> --
>
>
>
>

Mario López

unread,
Sep 6, 2012, 1:07:42 PM9/6/12
to publice...@googlegroups.com
@Roberto:

a mí me parece que estás haciendo exactamente lo mismo que

---

lcStrings = "Uno Dos Tres Cuatro Cinco Tres"
lnPos = RAT("Tres", lcStrings)
? Substr(lcStrings, lnPos)
---

que es lo que te había contestado Pablo antes.

Saludos,
Mario

---

ZeRoberto

unread,
Sep 6, 2012, 1:15:00 PM9/6/12
to publice...@googlegroups.com
Rat es de atras para adelante no?

Gracias a ambos pense que AT y RAT eran iguales.

Saludos

El 06/09/12, Mario López <guag...@gmail.com> escribió:
>> El 06/09/12, Pablo Daniel Lissa <pablo.dan...@gmail.com <javascript:>>
> --
>
>
>
>

Mario López

unread,
Sep 6, 2012, 1:32:04 PM9/6/12
to publice...@googlegroups.com
@Roberto:

RAT viene de "Reverse AT", o sea, busca al revés (desde el último caracter al primero).

las funciones xxxC (ATC / RATC / etc) son iguales que las funciones sin el sufijo C pero no toman en cuenta la diferencia entre minúsculas / mayúsculas (o sea, ATC("u", "UDT") devuelve 1 mientras que AT devuelve 0)

Saludos,
Mario

---

Pablo Daniel Lissa

unread,
Sep 6, 2012, 2:34:27 PM9/6/12
to publice...@googlegroups.com
Una curiosidad, Mario. No es tan así. Fijate en este ejemplo:

? ATC("A", "Pablo")        && Devuelve 2
? RATC("A", "Pablo")        && Devuelve 0

Es que RATC no es la reversa de ATC, sino de AT_C, que es otro método. La verdad, yo no los uso. Alguna vez busqué las diferencias para saber y no me quedó muy claro. Creo que era algo relativo a que AT_C y RATC permiten trabajar con campos memo.

Luego, siendo A la cadena buscada, B la cadena en que se busca y N (opcional) el número de ocurrencia:
Para buscar case sensitive:
AT(A, B, N)
RAT(A, B, N)

Para buscar case insensitive:
ATC(A, B, N)
RAT(UPPER(A), UPPER(B), N)

Saludos.
----------------------------------------------------------------------------------------------------------------------------

Mario López

unread,
Sep 6, 2012, 2:53:15 PM9/6/12
to publice...@googlegroups.com
@Pablo:

tenés razón, en realidad no están muy bien elegidos los nombres de las funciones VFP, a veces usan la C final para el "case" mayúscula/minúscula (ATC) y otras veces lo usan para las cadenas "double byte" (RATC). Otras veces usan el sufijo _C para estas cadenas (AT_C), así que no parece haber mucha consistencia. O por ahí me estoy malacostumbrando a Python, donde la consistencia es la regla :).

Lo de AT_C / RATC / etc. no es por los campos memo, es por las cadenas "double byte" (ver http://fox.wikis.com/wc.dll?Wiki~DoubleByte).

Saludos,
Mario
---

ZeRoberto

unread,
Sep 6, 2012, 3:15:41 PM9/6/12
to publice...@googlegroups.com
Haber otra pregunta relacionado con textos

Se puede buscar un texto en otro desde una posicion determinada?

Ejemplo

Buscar("A", "ABCDABCDABCD", 4)

Saludos


El 06/09/12, Mario López <guag...@gmail.com> escribió:
>> *AT(A, B, N)
>> RAT(A, B, N)
>> *
>> Para buscar case insensitive:
>> *ATC(A, B, N)
>> RAT(UPPER(A), UPPER(B), N)
>> *
> --
>
>
>
>

Víctor Hugo Espínola Domínguez

unread,
Sep 6, 2012, 3:36:34 PM9/6/12
to publice...@googlegroups.com
A VER una solución:

lcStrings = "Uno Dos Tres Cuatro Cinco Tres"
lcBuscar  = "Tres"
lnPosIni  = 11

lnPos = AT( lcBuscar, SUBSTR( lcStrings, lnPosIni ) ) + lnPosIni - 1

? lcStrings
? lnPos
? Substr( lcStrings, lnPos,  lcBuscar  )
? Substr(lcStrings, lnPos, LEN( lcBuscar ) )

Saludos.
Víctor.


--




Pablo Daniel Lissa

unread,
Sep 7, 2012, 8:07:07 AM9/7/12
to publice...@googlegroups.com
Mario:

Gracias por la explicación de ayer. Es cierto, no es muy consistente la nomenclatura usada.

Saludos.
-------------------------------------------------------------------------------------------------------------
Reply all
Reply to author
Forward
0 new messages