Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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!!
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.
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.
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!
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.
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>','')
,' ','')
,'<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: "Courier New";">','')
,'<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:"Calibri","sans-serif";mso-bidi-font-family:Calibri">','')
,'<o:p>','')
,'</o:p>','')
,'<p class="MsoNormal">','')
,'<span style="color:#002060">','')
,'<span style="font-size:11.0pt;font-family:"Calibri",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:"Calibri",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!!
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.