Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Os pongo un ejemplo del problema que tengo:
En la BBDD tenemos una tabla con la siguiente información:
id | mensaje | campo A | campo B |
100 | Mensaje #temaA que nos llega hoy #temaB al final del día | A | X |
101 | Mensaje numero 2 | B | Y |
102 | #temaC se ha abierto como tema de conversación | C | Z |
Y queremos generar una tabla intermedia que quede de la forma siguiente y que será de la que saquemos el informe (si se puede hacer sin crear una tabla intermedia también vale):
id | mensaje | tema | campo A | campo B |
100 | Mensaje #temaA que nos llega hoy #temaB al final del día | #temaA | A | X |
100 | Mensaje #temaA que nos llega hoy #temaB al final del día | #temaB | A | X |
101 | Mensaje numero 2 |
| B | Y |
102 | #temaC se ha abierto como tema de conversación | #temaC | C | Z |
Es decir, por cada registro que lee de la bbdd queremos contar el número de palabras que empiezan con el carácter ‘#’ en el campo mensaje, y generar una tabla o informe en el que el mensaje se repita n veces (tantas como nº de # se encuentren en el mensaje leído) y en un campo nuevo poner el valor de este campo #.
El script que estoy intentando hacer es algo asi:
MyTab:
load
Text as "Texto Mensaje"
,SubStringCount(Text,'#') as contador
;
sql select Text
from TablaA A, TablaC C, TablaD D
WHERE .....
............
;
let contador = SubStringCount(Text,'#');
IF contador <> 0 then
do while contador <> 0
let posicion = FindOneOf(Text,'#');
let TemaEncontrado = Mid(Text, FindOneOf(Text,'#'));
let longTemaEncontrado = FindOneOf(Mid(Text, FindOneOf(Text,'#')) , ' ');
let Tema = Left(Mid(Text, FindOneOf(Text,'#')) , FindOneOf(Mid(Text, FindOneOf(Text,'#')) , ' '));
let Text = Mid(Mid(Text, FindOneOf(Text,'#')),FindOneOf(Mid(Text, FindOneOf(Text,'#')) , ' '));
load
SubStringCount(Text,'#') as contador,
FindOneOf(Text,'#') as posicion,
Mid(Text, FindOneOf(Text,'#')) as TemaEncontrado,
FindOneOf(Mid(Text, FindOneOf(Text,'#')) , ' ') as longTemaEncontrado,
Left(Mid(Text, FindOneOf(Text,'#')) , FindOneOf(Mid(Text, FindOneOf(Text,'#')) , ' ')) as Tema,
Text as mensaje
;
let contador = SubStringCount(Text,'#');
loop
END IF
Hola Laura,
Te propongo que utilices la función SubField(), que es muy útil en estos casos. Una buena solución sería utilizándola de forma que en una primera pasada separases todas las palabras, y en la segunda te quedaras solamente con las que empiezan con #. Creo que sería más fácil de mantener:
//Tabla de ejemplo
Cadenas_TMP:
LOAD * INLINE [
id, mensaje, campoA, campoB
100, Mensaje #temaA que nos llega hoy #temaB al final del día, A, X
101, Mensaje numero 2, B, Y
102, #temaC se ha abierto como tema de conversación, C, Z
];
//Carga y desglose de los registros que contienen etiquetas con #
Cadenas_TMP2:
LOAD
*,
SubField(mensaje, ' ') AS Etiqueta
Resident Cadenas_TMP
Where Index(mensaje, '#') > 0;
// Me quedo ahora solamente con las etiquetas que empiezan con #
Cadenas:
NoConcatenate
LOAD *
Resident Cadenas_TMP2
Where Left(Etiqueta, 1) = '#';
// Y añado los registros que no tienen ninguna etiqueta, con ese campo vacío
Concatenate(Cadenas)
LOAD
*,
'' AS Etiqueta
Resident Cadenas_TMP
Where Index(mensaje, '#') = 0;
DROP Table Cadenas_TMP;
DROP Table Cadenas_TMP2;
Hola Laura,
Te propongo que utilices la función SubField(), que es muy útil en estos casos. Una buena solución sería utilizándola de forma que en una primera pasada separases todas las palabras, y en la segunda te quedaras solamente con las que empiezan con #. Creo que sería más fácil de mantener:
//Tabla de ejemplo
Cadenas_TMP:
LOAD * INLINE [
id, mensaje, campoA, campoB
100, Mensaje #temaA que nos llega hoy #temaB al final del día, A, X
101, Mensaje numero 2, B, Y
102, #temaC se ha abierto como tema de conversación, C, Z
];
//Carga y desglose de los registros que contienen etiquetas con #
Cadenas_TMP2:
LOAD
*,
SubField(mensaje, ' ') AS Etiqueta
Resident Cadenas_TMP
Where Index(mensaje, '#') > 0;
// Me quedo ahora solamente con las etiquetas que empiezan con #
Cadenas:
NoConcatenate
LOAD *
Resident Cadenas_TMP2
Where Left(Etiqueta, 1) = '#';
// Y añado los registros que no tienen ninguna etiqueta, con ese campo vacío
Concatenate(Cadenas)
LOAD
*,
'' AS Etiqueta
Resident Cadenas_TMP
Where Index(mensaje, '#') = 0;
DROP Table Cadenas_TMP;
DROP Table Cadenas_TMP2;