Skip to main content
Announcements
Introducing Qlik Answers: A plug-and-play, Generative AI powered RAG solution. READ ALL ABOUT IT!
cancel
Showing results for 
Search instead for 
Did you mean: 
Anonymous
Not applicable

Eliminar etiquetas html

Hola!

Tengo un campo en base de datos con unos textos que se recogen con formato de html como este:

<span style="color: rgb(51, 51, 51); font-family: Raleway, Arial, sans-serif; font-size: 12px; background-color: rgb(244, 244, 244);">Texto de ejemplo.</span>

Muchos de los comentarios con infinidad de etiquetas (más de 400), no encuentro ninguna manera de convertirlo a texto plano para poder ser leido sin dificultad por los usuarios:

Texto de ejemplo.

¿Alguien sabe cómo podríamos limpiarlo preferiblemente en el script de carga?

Gracias por la ayuda!!

1 Solution

Accepted Solutions
Anonymous
Not applicable
Author

Creo que así me funciona:

load id,comentarios,

replace(

if(comentarios like '*<*',

TextBetween(comentarios, '', '<',1)&

TextBetween(comentarios, '>', '<',1)&

TextBetween(comentarios, '>', '<',2)&

TextBetween(comentarios, '>', '<',3)&

...

...

...

TextBetween(comentarios, '>', '<',399)&

TextBetween(comentarios, '>', '<',400)

,comentarios)

,' ','')

as comentarios_limpios;

sql select id,comentarios,comentarios as comentarios_limpios

from tabla;

Lo que hago en el load es lo opuesto, coger todo lo que no este dentro de los corchetes "<>" en vez de quitar lo que está dentro. No pongo más de 400 porque en este caso QV no me permite más que eso.

View solution in original post

5 Replies
Miguel_Angel_Baeyens

Si el caso es como el ejemplo que pones en cada línea, siempre puedes utilizar

TextBetween('Cadena','>','</')

o algo similar. Generalmente puede ser más complicado, si en la misma línea hay más de una etiqueta.

Otra opción que puedes probar es primero convertir todas las etiquetas en algo fácilmente identificable y que no aparezca en el texto, como '$$$$$' y posteriormente eliminarlo:

Replace(Replace(TextBetween('Cadena', TextBetween('Cadena', '<', '>'), '$$$$$'), '<$$$$$>', '')

Tendrás que iterar ya que en cada línea puede haber dos etiquetas, una de apertura y otra de cierre.

Anonymous
Not applicable
Author

Hola Miguel Ángel,

Muchísimas gracias por la ayuda!!

Estoy intentando hacer el script y creo que tengo un problema de base que no sé resolver, (llevo varias horas y sigo bloqueado).

Tengo por ejemplo la siguiente tabla en BBDD:

     Select fecha,comentarios FROM crmDbdev_03.controles

Y quiero llegar a que el script tenga la siguiente tabla:

     set query = 'Select fecha,comentarios,comentarios_limpios FROM crmDbdev_03.controles';
     Load *;
     sql $(query);

En donde comentarios_limpios tenga el bucle que comentabas. Y para ello he hecho el script:

     set query_parte_1 = 'select fecha,comentarios,';

     set query_parte_2 = crmDbdev_03.controles.comentarios;

     for i=1 to 500
     query_parte_2 = Replace(Replace(query_parte_2, TextBetween(query_parte_2, '<', '>'), '$$$$$'), '<$$$$$>', '');
     next

     set query_parte_3 = ' as comentarios_limpios FROM crmDbdev_03.controles';

     query = query_parte_1 & query_parte_2 & query_parte_3

     Load *;
     sql $(query);

Pero no funciona porque parece que no hace el bucle y finalmente la variable query_parte_2 = crmDbdev_03.controles.comentarios

Gracias!

Miguel_Angel_Baeyens

Esa iteración debería hacerse en la parte del LOAD en lugar del SELECT. El ejemplo más sencillo sería:

Tabla:

LOAD Campo1, Campo2; // esto es lo que se carga en QlikView. Cualquier función de script válida se aplica aquí

SQL SELECT Campo1, Campo2 FROM Esquema.Tabla; // esto es lo que se lee de la BBDD, cualquier sentencia SQL válida permitida por el driver se puede utilizar aquí

Con esto, ahora puedes leer línea por línea y hacer las modificaciones que sean necesarias.

Tienes códigos de ejemplo en este thread Removing HTML markup code‌.

Anonymous
Not applicable
Author

Creo que no se puede hacer más de 100 bucles:

"Error in expression: Too complex, more than 100 levels nesting load "

no me hace el apaño pero para al que le sirva, la expresión sería:

load id,comentarios,
Replace(
Replace(
Replace(

...

...

...

Replace(
comentarios
, '<'&
TextBetween(comentarios, '<', '>',1)&'>', '')
, '<'&
TextBetween(comentarios, '<', '>',2)&'>', '')
, '<'&
TextBetween(comentarios, '<', '>',3)&'>', '')

...

...

...

  , '<'&TextBetween(comentarios, '<', '>',99)&'>', '')
as comentarios_limpios;

sql select id,comentarios
from tabla;


Lo que he hecho para lipiar un poco más de momento las etiquetas es hacer un replace de mysql:

Select replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(

comentarios

,'<!--[if gte mso 9]>','')

,'<xml>','')

,'<o:OfficeDocumentSettings>','')

,'<o:AllowPNG/>','')

,'</o:OfficeDocumentSettings>','')

,'><![endif]-->','')

,'<w:WordDocument>','')

,'<w:View>'      ,'')

,'</w:View>','')

,'<w:Zoom>'     ,'')

,'</w:Zoom>','')

,'<w:TrackMoves/>','')

,'<w:TrackFormatting/>','')

,'<w:HyphenationZone>'              ,'')

,'</w:HyphenationZone>','')

,'<w:PunctuationKerning/>','')

,'<w:ValidateAgainstSchemas/>','')

,'<w:SaveIfXMLInvalid>','')

,'<w:PunctuationKerning/>','')

,'<div>'                        ,'')

,'</div>','')

,'<br>','')

,'<span style="white-space:pre">','')

,'<span>','')

,'</span>','')

,'<span class="Apple-tab-span" style="white-space:pre">','')

,'<h5 class="entry-title">','')

,'<p style="line-height: 1;">','')

,'</p>','')

,'&nbsp','')

,'<p class="MsoNormal" style="margin-bottom: 0.0001pt; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial;">','')

,'<p class="MsoNormal" style="margin-left:18.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo1">','')

,'<span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">','')

,'<p class="MsoNormal" style="margin-left:18.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo2">','')

,'<!--[if !supportLists]-->','')

,'<span style="font-size:10.0pt;font-family:Symbol;mso-fareast-font-family:Symbol;  mso-bidi-font-family:Symbol">','')

,'<p class="MsoNormal" style="text-align:justify">','')

,'<span style="font-size:10.0pt; font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;mso-bidi-font-family:Calibri">','')

,'<o:p>','')

,'</o:p>','')

,'<p class="MsoNormal">','')

,'<span style="color:#002060">','')

,'<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif; color:#C00000;mso-fareast-language:EN-US">','')

,'<span style="text-indent: -18pt; font-family: Wingdings;">','')

,'<b>','')

,'</b>','')

,'<ul style="margin-top:0cm" type="disc">','')

,'</i>','')

,'<i>','')

,'<p>','')

,'</p>','')

,'<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,sans-serif; color:#C00000;mso-fareast-language:EN-US">','')

,'</w:SaveIfXMLInvalid> ','')

,'<w:SaveIfXMLInvalid> ','')

,'<w:IgnoreMixedContent>','')

,'</w:IgnoreMixedContent>','')

,'<w:AlwaysShowPlaceholderText>','')

,'</w:AlwaysShowPlaceholderText>','')

,'<w:DoNotPromoteQF/>','')

,'</w:DoNotPromoteQF/>','')

,'<w:LidThemeOther>','')

,'</w:LidThemeOther>','')

,'<w:TrackMoves>','')

,'</w:TrackMoves>','')

,'<w:ValidateAgainstSchemas>','')

,'</w:ValidateAgainstSchemas>','')

,'<ul>','')

,'<li>','')

,'<span style="font-weight: bold;">','')

,'<span style="color: rgb(0, 176, 208); font-family: Raleway, Arial, sans-serif; font-size: 12px; background-color: rgb(221, 221, 221);">','')

,'<span style="color: rgb(51, 51, 51); font-family: Raleway, Arial, sans-serif; font-size: 12px; background-color: rgb(244, 244, 244);">','')

,'<tr height="21">','')

,'<td class="xl567" style="height:15.75pt;width:60pt" width="80" height="21">','')

,'</td>','')

,'<td class="xl566" style="border-left:none;width:146pt" width="195">','')

,'<td class="xl566" style="border-left:none;width:91pt" width="121">','')

,'<![endif]-->','')

,'<!--[if !mso]>','')

,'<p style="margin: 0cm 0cm 15pt; text-align: justify; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial;">','')

,'<o:AllowPNG>','')

,'<ul style="margin-top:0cm" type="circle">','')

,'<li class="MsoNormal" style="margin-left:0cm;mso-list:l0 level2 lfo1">','')

,'</li>','')

,'</ul>','')

,'</ul>','')

,'</u>','')

,'<u>','')

,'<w:TrackFormatting>','')

,'</w:TrackFormatting>','')

,'<w:PunctuationKerning>','')

,'</w:PunctuationKerning>','')

,'</w:SaveIfXMLInvalid>','')

,'<w:DoNotPromoteQF>','')

,'</w:DoNotPromoteQF>','')

,'<w:LidThemeAsian>','')

,'</w:LidThemeAsian>','')

,'</o:AllowPNG>','')

,'</w:SaveIfXMLInvalid>','')

From tabla


Muchas gracias Miguel Ángel!!

Anonymous
Not applicable
Author

Creo que así me funciona:

load id,comentarios,

replace(

if(comentarios like '*<*',

TextBetween(comentarios, '', '<',1)&

TextBetween(comentarios, '>', '<',1)&

TextBetween(comentarios, '>', '<',2)&

TextBetween(comentarios, '>', '<',3)&

...

...

...

TextBetween(comentarios, '>', '<',399)&

TextBetween(comentarios, '>', '<',400)

,comentarios)

,' ','')

as comentarios_limpios;

sql select id,comentarios,comentarios as comentarios_limpios

from tabla;

Lo que hago en el load es lo opuesto, coger todo lo que no este dentro de los corchetes "<>" en vez de quitar lo que está dentro. No pongo más de 400 porque en este caso QV no me permite más que eso.