Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Em meu script declarei alguns arrays:
SET vCasoA = 'A', 'B';
SET vCasoB = 'C', 'D';
E a minha tabela:
LOAD
Palavra,
Teste
FROM arquivo.csv;
O que estou tentando fazer é:
Verificar se o campo Palavra possui valores que estão nesses arrays.
Exemplo:
Palavra = "Animal" => Preciso verificar se existe existe alguma letra ou trecho na palavra "Animal" que se enquadre em algum Array.
Neste caso se enquadraria no vCasoA.
Tentei fazer algo com a função "Index", mas não consigo fazer ela percorrer os valores contidos em um array.
Alguma de ideia de como posso fazer isso?
Veja se é +- isso que vc precisa:
TabArray:
LOAD *,
SubField(ARRAY,',') AS VALOR_ARRAY
Inline [
CLASS, ARRAY
CasoA, "a,b,cd,dd,de"
CasoB, "dce,an1,peg"
CasoC, "1ed,eeee,5g4"
CasoD, "23d3,we43,4ree" ];
TabStrings:
load *
Inline [
TEXTO
"gjeksdce"
"hsieuhsia"
"dorkijdrio1edkofitj"
"rjoirsjoa"
"sehiuesh23d3hei"
"oijeran1ojio" ];
FOR vCont = 0 to NoOfRows('TabArray')
let vArray = peek('VALOR_ARRAY' , $(vCont) , 'TabArray' ) ;
let vClass = peek('CLASS' , $(vCont) , 'TabArray' ) ;
tab_final:
load
TEXTO,
'$(vClass)' as CLASSIFICACAO
Resident TabStrings WHERE Index(TEXTO, '$(vArray)' ) > 0;
next
exit Script
São só letras nesse array() ? Tem a função PurgeChar() que tbm daria para usar se fosse buscar caracters dentro do campo, mas se for pra busca uma palavra ou conjunto de caracter, dai acho essa função não serviria, teria que ser o index() mesmo e pra fazer percorrer os valores tu pode tentar usar um FOR EACH
No exemplo usei somente caracteres, mas na verdade poderei ter palavras ou pedaços de palavras. por exemplo 'Ani' ou 'mal'.
Tentei usar o for each mas ao rodar o script ele da erro de syntax, e não consegui descobrir o que tinha de errado.
LOAD
Palavra,
Teste,
For Each valor in $(vCasoA)
If(Index(Palavra, valor), 'Caso A') as Tipo
Next
FROM arquivo.csv
ele sublinha a palavra Each e valor de vermelho e o script não roda!
o For each tem que ficar fora do LOAD
qual é o objetivo final? trazer apenas o que tem no array() ? Se for isso, tente assim:
For Each vCasoA in 'A', 'B','mal','ani'
LOAD *
FROM arquivo.csv
where Index(Palavra, '$(vCasoA)') > 0 ;
next
Se não for isso, não der certo, poste um qvw de exemplo pra ficar mais fácil de ajudar.
Coincidentemente hoje eu precisei fazer algo parecido
SET Folders = ,- Portinho;
For i = 0 to 5
For j = 0 to SubStringCount(Folders,',') // Verificando quantos tem
Let Folder=SubField(Folders,',',j+1); // Pegando um dos valores
Rodrigo, o objetivo é criar uma classificação dependendo os valores que tem no array. Por exemplo no Array vCasoA eu tenho 5 valores, e quando for fazer o load a descrição que se encaixar nos valores do array recebe uma classificação tipo CasoA, e assim sucessivamente... no caso eu teria varios arrays não somente um.. eu teria no minimo uns 5 arrays.
Vou fazer uns testes com está solução...
Veja se é +- isso que vc precisa:
TabArray:
LOAD *,
SubField(ARRAY,',') AS VALOR_ARRAY
Inline [
CLASS, ARRAY
CasoA, "a,b,cd,dd,de"
CasoB, "dce,an1,peg"
CasoC, "1ed,eeee,5g4"
CasoD, "23d3,we43,4ree" ];
TabStrings:
load *
Inline [
TEXTO
"gjeksdce"
"hsieuhsia"
"dorkijdrio1edkofitj"
"rjoirsjoa"
"sehiuesh23d3hei"
"oijeran1ojio" ];
FOR vCont = 0 to NoOfRows('TabArray')
let vArray = peek('VALOR_ARRAY' , $(vCont) , 'TabArray' ) ;
let vClass = peek('CLASS' , $(vCont) , 'TabArray' ) ;
tab_final:
load
TEXTO,
'$(vClass)' as CLASSIFICACAO
Resident TabStrings WHERE Index(TEXTO, '$(vArray)' ) > 0;
next
exit Script