¿Has necesitado alguna vez extraer frases completas de un texto?
Imagina que tienes una tienda online con cientos de productos. Cada uno lleva una descripción larga, de las que se escriben con cariño, y ahora te piden una meta descripción de unos 150 caracteres para cada uno. Tienes todo el texto en una columna de Calc, ordenadito, y solo te falta recortarlo.
Pero hay un detalle que lo cambia todo: no vale cortar a lo bruto. Una descripción que termina en «ideal para el cui» queda fatal en un buscador. Lo que quieres es quedarte, empezando por la izquierda, con las frases completas que quepan dentro del límite, es decir, cortar justo en el último punto.
Esta es la historia de los intentos que hice, de por qué fallaron uno a uno y de la fórmula que, por fin, hace el trabajo. Para seguirla, usaremos siempre el mismo texto de ejemplo, escrito en la celda A1:
Lámpara de mesa artesanal. Fabricada en madera de haya con acabado natural. Incluye bombilla LED de bajo consumo y cable textil de dos metros. Perfecta para estudios y dormitorios acogedores. Garantía de dos años y envío gratuito.Son 230 caracteres y cinco frases. Necesitamos reducirlo a 150 como máximo.
Primer intento: Datos > Validez
Lo primero que aparece al buscar «limitar caracteres en una celda» es la validación de datos. Se configura así:- Selecciona la columna.
- Abre el menú Datos > Validez.
- En Permitir elige Longitud de texto, en Datos elige menor que y en Máximo escribe el límite.
- En la pestaña Mensaje de error, activa la casilla y deja la acción en Parar.
Segundo intento: IZQUIERDA con el límite fijo
Si no se puede limitar, se recorta con una fórmula. La funciónIZQUIERDA devuelve los primeros caracteres de un texto:
=IZQUIERDA(A1;150)
Por qué no sirve: corta a ciegas. Con nuestro ejemplo, el carácter 150 cae en mitad de «Perfecta», y te quedas con «…cable textil de dos metros. Perfect». Cumple el límite, pero deja una palabra y una frase a medias, justo lo que queríamos evitar.
Tercer intento: cortar en el siguiente espacio
Para no partir palabras, se puede combinarIZQUIERDA con HALLAR: busca el primer espacio a partir de la posición 145 y corta justo antes.
=IZQUIERDA(A1;HALLAR(" ";A1;145)-1)
Por qué no sirve: las palabras ya no se parten, pero el resultado no respeta el límite. Sale un texto de 145 caracteres o más, según lo larga que sea la palabra que toque. Además, no entiende de frases: corta por el espacio, no por el punto. Y si el texto es corto y no hay ningún espacio después de la posición 145, la fórmula devuelve un error.
Cuarto intento: una macro que busque por la derecha
El problema de fondo es queHALLAR siempre busca de izquierda a derecha, y nosotros necesitamos el último punto dentro de los 150 primeros caracteres. Calc no trae una función para buscar desde la derecha, así que se puede escribir una macro en Basic que recorra el texto hacia atrás y devuelva la posición del carácter buscado.
Por qué no compensa: funciona, pero es matar moscas a cañonazos. Hay que abrir el editor de macros, pegar el código, guardarlo en el documento y aceptar los avisos de seguridad cada vez que se abre el archivo. Si el archivo se guarda en otro formato o se abre en otro equipo, la macro puede no estar o no ejecutarse. Para una tarea tan simple, es mucha maquinaria.
La solución: una expresión regular
La buena noticia es que Calc entiende expresiones regulares dentro de las fórmulas, y con una de ellas se puede localizar el último punto sin macros:=HALLAR("\.(?!.*\.)";IZQUIERDA(A1;150))
Así funciona, por partes:
IZQUIERDA(A1;150)se queda con los primeros 150 caracteres.\.busca un punto. La barra invertida es necesaria porque, en una expresión regular, el punto sin más significa «cualquier carácter».(?!.*\.)es una condición negativa: exige que detrás de ese punto no haya ningún otro punto. Solo cumple esa condición el último, y por esoHALLARdevuelve su posición.
IZQUIERDA:
=IZQUIERDA(A1;HALLAR("\.(?!.*\.)";IZQUIERDA(A1;150)))
Con nuestro ejemplo, el resultado son las tres primeras frases completas, 142 caracteres y ni una palabra partida:
Lámpara de mesa artesanal. Fabricada en madera de haya con acabado natural. Incluye bombilla LED de bajo consumo y cable textil de dos metros.
Mejora: que no falle con textos cortos ni sin puntos
La fórmula anterior tiene dos puntos débiles. Si el texto ya mide 150 caracteres o menos, la regla de «cortar en el último punto» le quitaría el final sin motivo. Y si en los primeros 150 caracteres no hay ningún punto, devuelve un error. Esta versión lo resuelve todo:=SI(LARGO(A1)<=150;A1;SI.ERROR(IZQUIERDA(A1;HALLAR("\.(?!.*\.)";IZQUIERDA(A1;150)));IZQUIERDA(A1;HALLAR("\s(?!.*\s)";IZQUIERDA(A1;150))-1)))
Hace tres cosas, en este orden:
- Si el texto ya cabe en 150 caracteres, lo deja tal cual.
- Si no, corta en el último punto dentro de los 150 primeros.
- Si no hay ningún punto, corta en el último espacio, para no partir ninguna palabra.
Advertencias antes de aplicarla a toda la columna
Valen para esta fórmula y para las que veremos a continuación.- Activa las expresiones regulares en las fórmulas. En Herramientas > Opciones > OpenOffice Calc > Calcular, comprueba que la evaluación de expresiones regulares en fórmulas está activada. Si no lo está, la fórmula devolverá un error.
- Con la opción activada, los caracteres especiales cuentan en todas tus fórmulas. Un punto, un asterisco o un signo de interrogación dentro de un texto entre comillas pasan a interpretarse como expresión regular. Si tienes otras fórmulas que los usan como texto normal, hay que escaparlos con una barra invertida (
\.). - Usa punto y coma como separador. En las versiones en español de Calc, los argumentos van separados por
;, no por comas. - Cuidado con los saltos de línea dentro de la celda. El punto (
.) de una expresión regular no coincide con un salto de línea, así que si el texto tiene saltos, la condición «que no haya otro punto detrás» solo se comprueba en la misma línea y puede elegir un punto que no es el último. - Escribe la fórmula en otra columna, no sobre el texto original. Una fórmula no puede estar en la misma celda que el dato del que depende, y así conservas las descripciones completas. Si luego quieres quedarte solo con el texto recortado, copia la columna y pégala con Pegar especial, dejando solo el texto.
- Los puntos que no cierran una frase cuentan igual. Una abreviatura («Sr.», «etc.») o un decimal («3.5») contiene un punto, y la fórmula puede cortar justo ahí.
- Solo reconoce el punto. Las frases que terminan en «?» o «!» no se tienen en cuenta. Si las necesitas, se puede ampliar la expresión.
- El resultado puede quedar mucho más corto que el límite si el primer punto aparece muy pronto. Es el precio de no dejar frases a medias.
- Prueba primero con unas pocas filas y revisa los resultados antes de arrastrar la fórmula a toda la columna.
También por la derecha: las frases completas del final
Lo mejor de esta técnica es que no sirve solo para quedarse con el principio. También nos sirve para extraer frases completas al final, o sea, por la derecha. Se hace al revés: tomamos los últimos 150 caracteres con DERECHA, buscamos el primer punto (ahora basta un HALLAR normal, sin condiciones especiales) y nos quedamos con lo que viene después, que ya empieza en una frase completa:
=SI(LARGO(A1)<=150;A1;SI.ERROR(DERECHA(DERECHA(A1;150);149-HALLAR("\.";DERECHA(A1;150)));DERECHA(A1;150)))
El «149» sale de 150 menos el punto menos el espacio que le sigue, para que el resultado no empiece con un espacio. Con nuestro ejemplo, devuelve las dos últimas frases:
Perfecta para estudios y dormitorios acogedores. Garantía de dos años y envío gratuito.Y si lo que necesitas es solo la última frase, sea del tamaño que sea, basta con localizar el penúltimo punto. Este caso supone que el texto termina en punto, sin espacios detrás:
=SI.ERROR(DERECHA(A1;LARGO(A1)-HALLAR("\.(?=[^.]*\.$)";A1)-1);A1)
La condición (?=[^.]*\.$) pide que, después del punto, solo haya texto sin puntos y luego un último punto al final. Con nuestro ejemplo devuelve:
Garantía de dos años y envío gratuito.Si el texto tiene una sola frase, no hay penúltimo punto y la fórmula devuelve el texto completo.
Y para terminar: la frase central
El complemento perfecto es obtener la frase central: la que contiene el punto medio del texto, limitada por los puntos que la rodean. Esta vez conviene usar tres columnas auxiliares, porque en una sola celda la fórmula sería ilegible. Con el texto en A1: B1: posición del último punto anterior a la mitad del texto (0 si no hay ninguno):=SI.ERROR(HALLAR("\.(?!.*\.)";IZQUIERDA(A1;ENTERO(LARGO(A1)/2)-1));0)
C1: posición del primer punto a partir de la mitad (o el final del texto, si no hay más puntos):
=SI.ERROR(HALLAR("\.";A1;ENTERO(LARGO(A1)/2));LARGO(A1))
D1: la frase que queda entre los dos puntos, saltando el espacio que sigue al primero:
=DERECHA(IZQUIERDA(A1;C1);C1-B1-SI(B1>0;1;0))
Con nuestro ejemplo, el punto medio está en el carácter 115. El punto anterior está en la posición 75 y el siguiente en la 142, así que D1 devuelve:
Incluye bombilla LED de bajo consumo y cable textil de dos metros.Si la mitad del texto cae justo sobre un punto, ese punto se considera el final de la frase central. Con una expresión regular, un par de funciones de texto y las advertencias anteriores, Calc pasa de cortar a ciegas a extraer frases completas: por la izquierda, por la derecha o desde el centro. Esta solución parte de una conversación del foro oficial en español de Apache OpenOffice, «Limitar número de caracteres en celda», donde se pueden leer las pruebas y los intentos originales. Para saber más sobre expresiones regulares en Calc y Writer:
- Buscar y reemplazar con expresiones regulares en OpenOffice Calc
- Usando expresiones regulares en Buscar-Reemplazar de OpenOffice Writer
- Usar el filtro predeterminado usando expresiones regulares
- Uso de las funciones SUMAR.SI y CONTAR.SI con expresiones regulares
- Usar expresiones regulares en fórmulas
- Web oficial de LibreOffice: Lista de expresiones regulares
- Documentación oficial de Apache OpenOffice: Regular Expressions in Calc (Wiki de Apache OpenOffice)