conocer posicion de un caracter dentro una cadena...

6,882 views
Skip to first unread message

Jhonny Zambrana

unread,
Feb 4, 2011, 10:48:26 AM2/4/11
to Comunidad de Visual Foxpro en Español
Estimados amigos tengo la siguiente cadena.
1364,11,01,30,09,24,59,02,20,C,
001870,005000,3740,01,03,03,02,147,,OK#
los primeros numeros pueden variar de ancho, es decir un momento
podria ser, 12034 o 23, puede tomar cualquier valor, las siguientes
posiciones son todas fijas, como puedo saber que posiscion tiene la
primera coma ",", ya qeu creo que seria la unica manera de poder
recuperar los siguientes datos con anchos fijos mediante el SUBSTR.
trate de utilizar el RAT() pero sucede que el ancho total tambien
puede variar alguna vez.

GRacias mil de antemano

Carlos Boemo

unread,
Feb 4, 2011, 10:56:13 AM2/4/11
to publice...@googlegroups.com
Te mando esta función que te retorna en el array todos los valores separados por la coma.

LPARAMETERS xcad,pcadenas
* PASAR PARAMETRO XCAD=STRING DEBE IR SEPARADO POR EL SEPARADOR XSEP
* PASAR PARAMETRO ARRAY(1)---> Dimension xarray(1) COMO REFERENCIA @xarray
LOCAL xsep,xlen,i,xcon,xaux

xsep =','
xcad = ALLTRIM(xcad)
xlen = LEN(xcad)

DO WHILE .t.  && saco separadores repetidos
   IF AT(REPLICATE(xsep,2),xcad)#0
      xcad=STRTRAN(xcad,REPLICATE(xsep,2),xsep) 
   else
      EXIT
   ENDIF 
ENDDO

xcad = ALLTRIM(xcad)
xlen = LEN(xcad)

DO WHILE .t.  && saco los separadores que se encuentran en la posición inicial de la cadena
   IF xlen > 1
      IF SUBSTR(xcad,1,1)=xsep
         xlen = xlen - 1
         xcad = ALLTRIM(SUBSTR(xcad,2,xlen))
         xlen = LEN(xcad)
      ELSE   
         EXIT
      ENDIF
   ELSE
      EXIT   
   ENDIF
ENDDO

DO WHILE .t.  && saco los separadores que se encuentren al final de la cadena
   IF xlen > 1
      IF SUBSTR(xcad,xlen,1)=xsep
         xlen = xlen - 1
         xcad = ALLTRIM(SUBSTR(xcad,1,xlen))
         xlen = LEN(xcad)
      ELSE 
         EXIT 
      ENDIF
   ELSE
      EXIT      
   ENDIF 
ENDDO
********* String Listo para separar **********
xaux = SPACE(0)
xcon = 0

FOR i = 1 TO xlen
    IF SUBSTR(xcad,i,1)=xsep
       IF !EMPTY(STRTRAN(xaux,xsep,''))
          xcon = xcon + 1
          DIMENSION pcadenas(xcon)
          pcadenas(xcon) = STRTRAN(xaux,xsep,'')   
          xaux = SPACE(0)
       endif
    else 
       xaux = xaux + SUBSTR(xcad,i,1)
    ENDIF 
ENDFOR

IF !EMPTY(STRTRAN(xaux,xsep,''))
    xcon = xcon + 1
    DIMENSION pcadenas(xcon)
    pcadenas(xcon) = STRTRAN(xaux,xsep,'')
ENDIF

FOR i = 1 TO xcon
    pcadenas(i)=UPPER(ALLTRIM(pcadenas(i)))
ENDFOR
--
Saludos.
Carlos Boemo

Oscar Díaz

unread,
Feb 4, 2011, 11:06:54 AM2/4/11
to publice...@googlegroups.com
Estimado Jhonny:

Yo haría algo así:

store '' to caract,caracts
store 0 to i,j
for i = 1 to len(alltrim(vble))
  caract = substr(alltrim(vble),i,1)
  if caract = ','
    j = j + 1
  else
    caracts = caracts + caract
  endif
  if j = 1
    store caracts to campo1
    store '' to caracts
  endif
  if j = 2
    store caracts to campo2
    store '' to caracts
  endif
*  etc para los campos...
endfor

Saludos desde Bogotá.co

JJ

unread,
Feb 4, 2011, 11:07:47 AM2/4/11
to publice...@googlegroups.com
Hola revisa este comando:
 
 
Devuelve la posición numérica inicial de la primera aparición de una expresión de caracteres o un campo memo dentro de otra expresión de caracteres o campo memo, contando a partir del carácter situado más a la izquierda.

Sintaxis

AT_C(cExpresiónBúsqueda, cExpresiónBuscada [, nAparición])

SAludos!!

JJ

unread,
Feb 4, 2011, 11:14:28 AM2/4/11
to publice...@googlegroups.com
 
Esto tambien te puede ayudar
 

The simple functions At() returns the position of one string within another. This example will return 5 because "E" first occurs as the 5th character of "ABCDEFGHABCDEFGH":

pos = At("E", "ABCDEFGHABCDEFGH")

If the target can't be found in the string then At() will return 0. The search is case-sensitive. Use the FoxPro AtC() function for a case-insensitive search.

The Rat() function will search backwards from the end of the string. This example will return 13 because "E" last occurs as the 13th character of "ABCDEFGHABCDEFGH":

pos = Rat("E", "ABCDEFGHABCDEFGH")

Both the At() and Rat() functions can take a third numeric parameter to specify whether FoxPro should report the first, second or nth instance of the character. This example will return 13 because it is looking for the second occurence of the target and "E" makes its second appearance as the 13th character of "ABCDEFGHABCDEFGH":

pos = At("E", "ABCDEFGHABCDEFGH", 2)

The FoxPro Occurs() function counts the number of times that a character occurs in another string.

 

Saludos a todos!!

Jeanette

Miguel Canchas

unread,
Feb 4, 2011, 11:36:13 AM2/4/11
to publice...@googlegroups.com
CLEAR

cCadena = "1364,11,01,30,09,24,59,02,20,C,001870,005000,3740,01,03,03,02,147,,OK# ,"

nVeces = OCCURS(",", cCadena)

FOR i = 0 TO nVeces
?SUBSTR(cCadena, IIF( i =0, 1, AT(",", cCadena, i)+1 ), ;
(IIF( i =0, AT(",", cCadena) , AT( ",", cCadena, i+1)) - ;
IIF( i =0, 0, AT(",", cCadena, i)) ) -1 )
ENDFOR


Recuerda siempre adicionarle una coma al final de la cadena..

MK

-----Mensaje original-----
De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de Jhonny Zambrana
Enviado el: viernes, 04 de febrero de 2011 10:48 a.m.
Para: Comunidad de Visual Foxpro en Español
Asunto: [vfp] conocer posicion de un caracter dentro una cadena...

Miguel Canchas

unread,
Feb 4, 2011, 11:37:29 AM2/4/11
to publice...@googlegroups.com

Tengo uno mas sencillo

 

CLEAR

 

cCadena = "1364,11,01,30,09,24,59,02,20,C,001870,005000,3740,01,03,03,02,147,,OK# ,"

 

nVeces = OCCURS(",", cCadena)

 

FOR i = 0 TO nVeces

      ?SUBSTR(cCadena, IIF( i =0, 1, AT(",", cCadena, i)+1 ), ;

                             (IIF( i =0, AT(",", cCadena) , AT( ",", cCadena, i+1)) - ;

                              IIF( i =0, 0, AT(",", cCadena, i)) ) -1  )

     

     

ENDFOR

 

Ponerle siempre una coma o variable por la cual se le hace la separación.

Echa al vuelo ..

 

MK

Jose Antonio Blasco

unread,
Feb 4, 2011, 12:38:18 PM2/4/11
to publice...@googlegroups.com
Y con "getwordcount()" y "getwordnum()" seria:

cCadena = "1364,11,01,30,09,24,59,02,20,C,001870,005000,3740,01,03,03,02,147,,OK#
,"
*
a=GETWORDCOUNT(cCadena,',')
*
FOR x=1 TO a
?GETWORDNUM(cCadena,x,',')
ENDFOR


Un saludo.


El día 4 de febrero de 2011 17:37, Miguel Canchas
<mcan...@ximesa.com> escribió:

--
Jose A. Blasco
Zaragoza - España

Luis Maria Guayan

unread,
Feb 4, 2011, 12:46:05 PM2/4/11
to publice...@googlegroups.com
Mas sencillo:

lcCadena = "1364,11,01,30,09,24,59,02,20,C,001870,005000,3740,01,03,03,02,147,,OK#,"
FOR ln = 1 TO ALINES(laArray, lcCadena, 2, ",")
  ? laArray(ln)
ENDFOR

Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

 

Jose Antonio Blasco

unread,
Feb 4, 2011, 1:03:41 PM2/4/11
to publice...@googlegroups.com
¿Quien da más?. jueguen, jueguen, señores....

;-)

Un saludo.

El día 4 de febrero de 2011 18:46, Luis Maria Guayan
<luis...@portalfox.com> escribió:

--

Carlos Boemo

unread,
Feb 4, 2011, 1:27:45 PM2/4/11
to publice...@googlegroups.com
Hay que reconocer que nos mataste!!!
--
Saludos.
Carlos Boemo

Alfonso Arias Lemas

unread,
Feb 4, 2011, 1:58:52 PM2/4/11
to publice...@googlegroups.com
Mira esta funcion:
ATC(",",<cadena>,1)     && devuelve la posición de la primera coma.
Saludos,
   Alfonso



De: Jhonny Zambrana <jhonny....@gmail.com>
Para: Comunidad de Visual Foxpro en Español <publice...@googlegroups.com>
Enviado: vie,4 febrero, 2011 14:48
Asunto: [vfp] conocer posicion de un caracter dentro una cadena...

Carlos Miguel FARIAS

unread,
Feb 4, 2011, 4:32:50 PM2/4/11
to publice...@googlegroups.com
Si necesitas recuperar los valores que estan entre las comas, lo mas simple es

local liQ, liControl as integer && liQ contendra cantidad de valores y liControl para manejar el parser
local array laValores[1] && arreglo donde cada uno de los elementos contendrá uno los valores
liControl = 1  && valor control parseo, hay varias opciones que se pueden combinar, ver ayuda
liQ = alines( laValores, liControl, ',' )

La sentencia alines es poderosisima, para separar elementos, los separadores pueden o no eliminarse (ver valores para liControl en la ayuda) y puede barrer por hasta 23 caracteres diferentes.
Además, el valor 1 (o incluido en la suma de valores de control) te elimina blancos previos o posteriores a los caracteres no blancos. Podes si queres eliminar los elementos vacios etc.

Los comandos indicados (AT, ATC, RAT, RATC) están porque vienen si mal no recuerdo desde fox dos, y el alines, si mal no recuerdo, aparecio en vfp 6.

Jhonny Zambrana

unread,
Feb 4, 2011, 4:49:24 PM2/4/11
to Comunidad de Visual Foxpro en Español
Como siempre digo, esta sera mi casa, cuando sea grande, lindo el
concurso de lo sencillo.

A todos mil gracias, yo creo que los otros foros se deben morir de
envidia, por tan linda comundad que tenemos.

Un barazo y un buen fin de semana.

PD. nadie sabe nada sobre win7tlib ??????

On 4 feb, 14:58, Alfonso Arias Lemas <ariasle...@yahoo.es> wrote:
> Mira esta funcion:
> ATC(",",<cadena>,1)     && devuelve la posición de la primera coma.
> Saludos,
>    Alfonso
>
> ________________________________
> De: Jhonny Zambrana <jhonny.zambr...@gmail.com>

ibania blanco

unread,
Feb 8, 2011, 3:38:54 PM2/8/11
to Comunidad de Visual Foxpro en Español
esta buena la batalla que se libro
> > GRacias mil de antemano- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -

rabcc101242

unread,
Jun 1, 2015, 2:27:36 PM6/1/15
to publice...@googlegroups.com, jabl...@gmail.com
Hola, buscando una ayuda, esta respuesta en lo particular me salvo, muchas muchas gracias para quien la publico, que bueno es compartir, espero poder ayudar en algo, gracias
Reply all
Reply to author
Forward
0 new messages