sábado, 28 de septiembre de 2024

Funciones. Textos.

Componer y descomponer una cadena.

Aunque, como hemos visto, una cadena puede ser simple (esto es, estar formada por una única palabra, por ejemplo), son las cadenas complejas las que nos interesan en nuestro trabajo, ya que son con las que trabajamos. Entiendo por cadena compleja aquella que está formada por varias palabras, pudiendo diferenciar al menos dos subtipos: las cadenas elementales, que están formadas por una frase simple, y las extensas, dentro de las que podemos identificar como párrafo o como texto. Aunque todas las cadenas complejas nos interesan, más aun las extensas. De ahí el interés que tiene conocer funciones que nos permitan trabajar con ellas.


Las dos funciones que trataré en esta entrada son ambas de tipo Built-In y se pueden considerar funciones a medio camino entre el tratamiento de textos y el trabajo con colecciones de datos (en este caso, listas), pero he preferido incluirlas en este subapartado de funciones de texto por el objeto con el que ambas trabajan: los string.

También conviene decir desde el principio, que sirven para trabajar con cadenas de texto complejas (según quedaron definidas éstas al inicio de la entrada), pero no de forma específica con textos extensos: es suficiente con que el string contenga varias palabras para que ambas sea de utilidad. Por motivos didácticos, en esta entrada no desarrollaremos ejemplos de uso con textos extensos, ya que el objetivo actual es aprender la sintaxis y el uso de las funciones (1). 

Dicho lo anterior, y entrando en materia, las funciones Join() (unir) y Split() (dividir) son dos funciones contrarias y por ello mismo complementarias: como sus nombres indican, la primera no permite unir en una única cadena el conjunto de elementos (palabras) que conforman una lista y la segunda separar o dividir los elementos (las palabras) que forma una cadena, convirtiéndolos en elementos de una lista.

La función Join() recibe dos argumentos: la lista de elementos (matriz) y el carácter que servirá de separador (variable). Esta es su expresión completa como función: Join( mListaPal(), sSepara) (2) y este un ejemplo de uso...

 Sub JuntarPalabras
 Dim mListaPal() As String
 Dim sSepara As String, sFrase As String
 
 mListaPal () = Array("El","pelo","de","Rosa","es","muy","bonito")
 sSepara = "-"
 sFrase = Join( mListaPal(), sSepara)
 
 MsgBox sFrase
 
 End Sub 

... cuyo resultado expresado (output) mediante MsgBox será el siguiente El-pelo-de-Rosa-es-muy-bonito.

Dado que este resultado no se ajusta a lo que esperamos como frase, será suficiente con sustituir el carácter asignado a sSepara por sSepara = " " (espacio) para apreciar mejor la utilidad de la función: El pelo de Rosa es muy bonito (3).

La función Split() es, como dije, la contraria de Join(): en este caso tratamos con una cadena (compleja) y obtenemos una lista de palabras. Para ello Split() recibe también dos parámetros de tipo String: la cadena de texto (o la variable a la que éste esté referenciado) y el grafema que servirá de referencia para la diferenciación de los elementos. Su sintaxis más simple es la siguiente: Split(sCadena, sSepara) (4) y esta una posible expresión concreta: Split("El pelo de Rosa es muy bonito"," "). Veamos una concreción...

Sub SepararPalabras
Dim sFrase As String, sSepara As String
Dim mListaPal() As String
Dim i As Integer 

sFrase = "El pelo de Rosa es muy bonito"
sSepara = " "
mListaPal = Split ( sFrase(), sSepara)
For i = LBound(mListaPal()) To UBound(mListaPal()) (5)
    MsgBox mListaPal(i)
Next 
End Sub 

... que nos devuelve, palabra a palabra, cada una de las que conforman sFrase.

En [esta entrada] veremos un uso especialmente interesante de ambas funciones.

NOTAS

(1) No es OOo Basic un lenguaje pensado para desarrollar procesos complejos de análisis de textos, así que tampoco debemos pensar el crear proyectos de gran envergadura en lo relativo al trabajo con textos complejos y extensos como los que son habituales en nuestro trabajo, pero el uso de estas funciones (en combinación con otras de esta misma temática), junto con el tratamiento de listas y matrices nos abre la posibilidad de crear procedimientos de trabajo más complejos de los que podríamos desarrollar sin su ayuda y, llevados estos procedimientos a la práctica, abordar el tratamiento de ítem de respuesta abierta, por poner un ejemplo. Algo que hasta ahora resultaba muy difícil de plantear.
(2) Así como es más que conveniente que el primer argumento haya sido definido previamente como lista (matriz), el segundo puede incorporarse directamente como string en lugar de hacerlo mediante una variable. Por ello, puede ser incluso más frecuente encontrar expresiones de la función que se ajusten a este modelo (Join( mListaPal(), "-") que la que he expuesto como modelo.
(3) Así como el objetivo de la matriz mListaPal era mostrar la relación entre este tipo de matrices y el trabajo con cadenas, el grafema "-" pretendía evidenciar la multiplicidad de formas de uso de la función Join(), que obviamente no se limita a la de facilitar la composición de frases, aunque ésta sea su mayor utilidad para nosotros, al menos en este momento y en función de la complementariedad de Join() con Split(). Sirva esta nota para advertir de posibles confusiones que yo mismo puedo provocar en mi exposición.
(4) En este caso ambos pueden expresarse directamente sin necesidad de usar variables, pero parece conveniente y más flexible asociar variables como parámetros, al menos en lo que se refiere al primer parámetro.
(5) Este bucle no tiene más objetivo que permitir observar que mListaPal() contiene los elementos esperados en función de la aplicación de la función Split(). Obsérvese que el objetivo del ejemplo es incidir en la complementariedad de esta función con la anterior; de ahí también la denominación de la matriz y de las variables.

No hay comentarios:

Publicar un comentario

Comenta esta entrada