Extraer caracteres

vForum público de la plataforma de desarrollo Velneo

Moderador: vCoaches

Avatar de Usuario
ebarbeito
vAdviser
vAdviser
Mensajes: 692
Registrado: 29 Mar 2006, 16:37
Ubicación: Alicante - Alicante - España (38.359746, -0.425613)
Contactar:

Mensaje por ebarbeito » 30 Dic 2006, 19:40

Buenas!

DomK jajaja ¿purista yo? ¡Ya me gustaria! Pero me da que ni llego a nivel de aprendiz en purismo :lol:

Cuco :) interesante esa función SIGLAS, lo de "Recorrer buffer" lo descubro con ella (y mira que ha estado delante de mis narices todo este tiempo... :lol:) Pero ¿funciona para todos los casos? No la he probado pero a primera vista parece que como el primer caracter de la cadena ser un delimitador ya la hemos liao. Y tampoco contempla múltiples delimitadores.

Hugo, la función que puse es un calentón de cinco minutos, descentrado y con la hora de irme (¡encima viernes!) pisándome los talones :lol: ¡No sirve, a la hoguera! He estado dándole vueltas y creo que la mejor solución es dividir el asunto en dos partes:
  • - Una de ellas que me separe la cadena de texto en las distintas palabras (o tokens) que existen separados por uno o más caracteres separadores.
    - La otra, que vaya concatenando a una variable resultante la primera letra de la palabra/token obtenida.
Con lo que necesitaría dos funciones:
  • - STR_INICIALES (str, sep )
    - STR_GET_TOKEN ( str, sep )
En ambas funciones, el primer parámetro es el texto del cual extraer bien iniciales, bien tokens; el segundo parámetro es el conjunto de caracteres separadores (al menos debe haber uno, o los que quieras "., ")

La función STR_INICIALES (str, sep ) sería:

Código: Seleccionar todo

Set result , ""
Libre
Rem forzar iteración hasta tratar toda la cadena
for , , fLen( 'str' ) ,
   Rem 1º - De cada token, me guardo su 1ra inicial , concatenando
   Set result , 'result' + fLeft( «STR_GET_TOKEN( 'str', 'sep' ), 1 )
   Libre
   Rem 2º - sobreescribo str desechando el token obtenido ( parámetros por referencia, os echo de menos snif :-( )
   Set str , fRight( 'str', fLen( 'str' ) - $STR_TOKEN_AUX$ - 1 )
Libre
Rem devolución de la concatenacion de iniciales
Set retorno función 'result'
Y STR_GET_TOKEN (str, sep ) sería:

Código: Seleccionar todo

Rem n_car     : nº caracteres que forman un token
Rem tokenized : breakpoint
Set n_car , 0
Set tokenized , 0
Libre
Rem recorrido y comparación de las cadenas str y sep, caracter a caracter
for i , 0 , ( 'tokenized' = 0 ) & ( 'i' < fLen( 'str' ) ) , 1
   Rem por defecto, se asume un caracter más
   Set n_car , 'n_car' + 1
   Libre
   for j , 0 , ( 'tokenized' = 0 ) & ( 'j' < fLen( 'sep' ) ) , 1
      Rem Cuando haya coincidencia: desechar caracter pre-asumido + breakpoint
      if fMid( 'str', 'i', 1 ) = fMid( 'sep', 'j', 1 )
         Set n_car , 'n_car' - 1
         Set tokenized , 1
Libre
Rem devolución del token: total de caracteres sumados a la izquierda de str
Modificar variable global STR_TOKEN_AUX , 'n_car' ,
Set retorno función fLeft( 'str', 'n_car' )
La idea de emplear la función STR_GET_TOKEN la he basado en la idea de disponer de una función parecida a strtok [1] en C. De modo que una vez se obtiene el fragmento deseado de la cadena original, se hace con ella lo que se quiera (obtener su primer caracter). Claro que... en Velázquez no es posible pasar parámetros por referencia con lo que el parámetro formal 'str' de la función STR_GET_TOKEN siempre será una copia de su parámetro actual. Lo suyo sería que este parámetro fuese una referencia a su parámetro actual y así poder sobreescribirlo desde dentro de STR_GET_TOKEN. Pero como no se puede pues me ha dado por salir del paso utilizando esa variable global y de ese modo. Se podrían hacer cambios para no usar ninguna variable global pero para no agrandar más el código he querido hacerlo así (aunque mal).

Haciendo pruebas, al llamar a STR_INICIALES con un texto y separador/es cualquiera, parece que funciona bien. Siempre y cuando el parámetro de separadores no esté vacío ("").

Un saludo

[1] - http://c.conclase.com/librerias/funcion.php?fun=strtok

[ edito: ups, escribí este mensaje cuando no estaba el último de Cuco jeje. Así que los comentarios sobre SIGLAS están desfasados :P ]
#!/Enrique/Barbeito/García ...
http://enrique.barbeito.org

¡Apúntate al grupo Velneo en Last.fm! [+info]

Avatar de Usuario
Cuco
vLeader
vLeader
Mensajes: 1179
Registrado: 20 Sep 2005, 20:45
Ubicación: Gijón - Asturias - España- Posición: 43.532928,-5.628616

Mensaje por Cuco » 30 Dic 2006, 21:18

Bueno, rectifico.

Modificaciones para incluir o no el primer carácter.
Para el caso de obtener la siglas, p.e. de un nombre y apellidos de personas, se ha de suponer que se incluye el primer carácter.

Para un caso más general se ha añadido otro parámetro para que se tenga en cuenta o no esta condición de incluir el primer carácter si no es un separador de los especificados en el parámetro correspondiente.
Adjuntos
Siglas-03.JPG
Siglas v. 1.03
(53.45 KiB) Descargado 257 veces
杜鹃鸟
Juan Miguel Figueroa Dorrego

Fontanía Lógica ™, E.P.I.
Una empresa personal imaginaria
Posición:
43.532928,-5.628616

Avatar de Usuario
Cuco
vLeader
vLeader
Mensajes: 1179
Registrado: 20 Sep 2005, 20:45
Ubicación: Gijón - Asturias - España- Posición: 43.532928,-5.628616

Mensaje por Cuco » 30 Dic 2006, 21:37

Parece que se exige una condición más, que puedan existir separadores contíguos.

Hay que completar la última condición.
Adjuntos
Siglas-03.JPG
Siglas v. 1.04
(56.27 KiB) Descargado 248 veces
杜鹃鸟
Juan Miguel Figueroa Dorrego

Fontanía Lógica ™, E.P.I.
Una empresa personal imaginaria
Posición:
43.532928,-5.628616

HBarros
vAdviser
vAdviser
Mensajes: 746
Registrado: 14 Feb 2006, 17:48
Ubicación: Vigo

Mensaje por HBarros » 31 Dic 2006, 14:37

Francamente me habeis dado una clase gratuita estupenda, no habia utilizado la funcion recorrer buffer nunca y tiene una gran utilidad para este tipo de casos.

Finalmente la funcion de Cuco me funciona estupendamente, si que habeis dado entre los dos una vuelta de tuerca mas a la función original y francamente para comprender mejor el tema de cadenas y caracteres ha sido un estupendo ejemplo.

Otra vez mas gracias a los dos no solo por la función si no tambien por la clase. :wink:

Un abrazo y cuidado esta noche con el Champagne!!! y las chavalas!!!!
:lol:

Avatar de Usuario
Cuco
vLeader
vLeader
Mensajes: 1179
Registrado: 20 Sep 2005, 20:45
Ubicación: Gijón - Asturias - España- Posición: 43.532928,-5.628616

Mensaje por Cuco » 01 Ene 2007, 11:20

Gracias por tus amables palabras, HBarros. Por lo visto Velneo tiene cosas aun un poco ocultas para los bastante experimentados. Sería bueno que fueran surgiendo y dieran la oportunidad de ponerlas a la luz del Foro.

Con respecto a la función Siglas, si sólo necesitas extraer la siglas de un nombre o texto en un campo, con la primera versión es suficiente porque Velneo elimina en edición y al perder el foco, todos los espacios anteriores o posteriores de los campos de cadenas de caracteres, de ahi que no es posible que una cadena comience con el separador, el espacio. Por otra parte en la composición de siglas es preceptivo que el primer carácter de la cadena original se incluya en las mismas.

Feliz año nuevo a todos
杜鹃鸟
Juan Miguel Figueroa Dorrego

Fontanía Lógica ™, E.P.I.
Una empresa personal imaginaria
Posición:
43.532928,-5.628616

Minky
vMate
vMate
Mensajes: 93
Registrado: 11 Abr 2006, 18:44
Ubicación: madrid

Mensaje por Minky » 03 Ene 2007, 13:11

Hola a todos me parece que os habeis complicado en la forma de obtener las "iniciales" de palabras.

A continuacion os expongo un proceso que figura en la ayuda de las versiones antiguas (no se si en la nueva esta) :

Proceso para ficha

Set-->contador.0
Set-->iniciales,""

Recorrer Buffer-->%NOMBRE%,caracter
if--> ('contador'=0) & ('caracter' ! " ")
Set-->iniciales, 'iniciales' + 'caracter'
Ser-->contador, 1
if-->'caracter' = " "
Set--> contador, 0

UN SALUDO Y FELIZ 2007

HBarros
vAdviser
vAdviser
Mensajes: 746
Registrado: 14 Feb 2006, 17:48
Ubicación: Vigo

Mensaje por HBarros » 03 Ene 2007, 15:50

Tienes razón, también he visto en la ayuda de recorrer buffer el siguiente adjunto:

De todos modos agradeceros a todos vuestra ayuda. :wink:

Un saludo

Avatar de Usuario
Agustin
vCoach
vCoach
Mensajes: 2953
Registrado: 21 Sep 2005, 06:17
Ubicación: Gijón-Asturias-España 43°32'15.44"N 5°39'13.70"W

Mensaje por Agustin » 03 Ene 2007, 16:39

Buenas tardes: interesantes las distintas soluciones a las que cada uno llega para solucionar el mismo probleama . Cada día me gusta más este foro pues como más se enriquece uno no es sólo pensando por sí mismo sino viendo cómo piensan los demás.
Por aportar un granito de arena, en el mapa de agenda colgado en el post-it de mapas hay un proceso llamado PERSONAS que estracta los primeros caracteres de nombre y dos apellidos de una persona para darlos luego de alta como datos.
Un saludo.
SC
Veni, vidi, vinci
Panta rei.
https://cagonmimantu.wordpress.com/

Avatar de Usuario
Cuco
vLeader
vLeader
Mensajes: 1179
Registrado: 20 Sep 2005, 20:45
Ubicación: Gijón - Asturias - España- Posición: 43.532928,-5.628616

Mensaje por Cuco » 03 Ene 2007, 20:04

Bueno, yo sigo dando por válida mi primera versión, igual de compacta y eficiente como la de la ayuda del Edmap que cita Minky, con el añadido - de funcionalidad no de complejidad - de parametrizarle el carácter separador.

Las conjeturas que se hacía Enrique Barbeito eran, entiendo yo, sobre otra función más general de extracción de caracteres, a cuyas conjeturas se contestaba a sí mismo proponiendo una serie de soluciones de mucho calado y profesionalidad, a lo que yo fui contestando en paralelo con soluciones sucesivas que pretendían satisfacer las exigencias de Enrique, utilizando una instrucción de proceso - "Recorrer Buffer" - que él y otros desconocían según confesaron tranquilamente. Y no la conocían porque si la hubieran conocido la hubieran utilizado a buen seguro, por la sagacidad que les caracteriza.

En cualquier caso fue una "jam session" magnífica.
杜鹃鸟
Juan Miguel Figueroa Dorrego

Fontanía Lógica ™, E.P.I.
Una empresa personal imaginaria
Posición:
43.532928,-5.628616

Avatar de Usuario
Adelo Herrero
vAdviser
vAdviser
Mensajes: 711
Registrado: 21 Sep 2005, 14:42
Ubicación: Requena (Valencia) - España - (Lat: 39.490701 * Lon: -1.102329 )
Contactar:

Mensaje por Adelo Herrero » 04 Ene 2007, 05:49

Buen@s:

Como el parámetro que recibe la función no tiene tamaño, puedes definir tantos separadores como desees, solamente con añadir una sustitución genérica al principio de la función; me explico:

Llamada a la función.
set szSeparador = "\-/_="
set szCadenaLimpia( 'szTexto', 'szSeparador' )

En la primera parte de la función de Cuco sustituiremos cada caracter incluído en la cadena 'szSeparador' por un espacio en blanco y como la función ya tiene en cuenta si hay varios separdores contiguos, ya lo tienes hecho ¿no?.

Código: Seleccionar todo

Recorrer buffer -> 'szSeparador', szSep
-- fSustituirSubCadena ( 'szTexto', 'szSep', " " ) 

--- y a partir de aquí la función de Cuco ---

Responder