Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Olá Pessoal, estou aqui para demonstrar uma forma simples de resolver um problema bem comum quando trabalhamos múltiplas fontes de dados: como remover acentos no Qlikview.
O cenário é bem típico. Eu tenho uma aplicação que mistura dados de múltiplas fontes de dados, incluindo um banco de dados Oracle e planilhas em Excel. O problema é que o nome das Cidades na base Oracle está acentuado e no Excel nem sempre. Então como igualar para poder realizar um link/join entre as informações.
A solução é bem simples. Vamos utilizar a função MapSubString. Esta função utiliza uma tabela com dois campos para executar uma substituição do tipo DE -> PARA, carácter a carácter.
mapsubstring(‘mapname’, expr)
Antes de utilizar a função MapSubString temos que carregar nossa tabela de conversão de caracteres. Bom vou dar uma colher de chá e publicar a que estou utilizando. Ela está bem completa, mas se precisar incluir mais uma conversão, fique a vontade, é só incluir uma nova linha. Segue o LOAD da tabela abaixo:
RemoveAcento_Map:
Mapping
LOAD * INLINE [
F1, F2
Š, S
š, s
Ž, Z
ž, z
À, A
Á, A
Â, A
Ã, A
Ä, A
Å, A
Æ, A
Ç, C
È, E
É, E
Ê, E
Ë, E
Ì, I
Í, I
Î, I
Ï, I
Ñ, N
Ò, O
Ó, O
Ô, O
Õ, O
Ö, O
Ø, O
Ù, U
Ú, U
Û, U
Ü, U
Ý, Y
Þ, B
ß, B
à, a
á, a
â, a
ã, a
ä, a
å, a
æ, a
ç, c
è, e
é, e
ê, e
ë, e
ì, i
í, i
î, i
ï, i
ð, o
ñ, n
ò, o
ó, o
ô, o
õ, o
ö, o
ø, o
ù, u
ú, u
û, u
ý, y
ý, y
þ, b
ÿ, y
];
Um pouco grande certo? Bom espero que ajude.
Continuando com nosso exemplo eu fiz uma pequena aplicação. Primeiro criei uma pequena tabela de nomes ao qual dei o nome de NOMES:
NOMES:
LOAD * INLINE [
NOME_NORMAL
Luiz Otávio
Pedro Miguel
William
Ícaro
Giovanni
João Paulo
Kauê
Maitê
Eloá
Lívia
];
Logo em seguida eu utilizo a função MapSubString para remover os acentos. O primeiro parâmetro da função MapSubString é o nome da tabela DE -> PARA que apresentei acima. O segundo é o campo onde os caracteres serão substituídos. Vejamos:
LOAD
NOME_NORMAL,
MapSubString('RemoveAcento_Map', NOME_NORMAL) as NOME_SEM_ACENTO
Resident NOMES;
O Resultado pode ser visto na imagem abaixo:
Se quiserem colocar em caixa alta (maiúscula) é só colocar um Upper antes do MapSubstring:
LOAD
NOME_NORMAL,
Upper(MapSubString('RemoveAcento_Map', NOME_NORMAL)) as NOME_SEM_ACENTO
Resident NOMES;
Bem é isso, espero que tenham gostado e que este post seja útil. Até breve e mandem seus comentários!
Segue o Código de Exemplo: http://wallace-prado.com.br/wp-content/uploads/2014/08/RemoverAcentos.zip
Isso ae !
Muito bom o Artigo wallace.prado. Não conhecia a função MapSubString.
Apenas uma sugestão para otimizar essa tradução.
Coloquei na tabela de Mapeamento de Acentos, apenas os caracteres em maíusculo, e no local onde a função vai ser utilizada, usar o UPPER antes, ficando da seguinte forma:
MapSubString('RemoveAcento_Map', UPPER(NOME_NORMAL)) as NOME_SEM_ACENTO
Assim a tabela de acentos fica com metade do tamanho, e para um grande volume de dados na tabela de aplicação, a busca pela troca de caracteres levaria metade do tempo!
Um abraço!
Obrigado por compartilhar, muito útil !
Vou precisar de usar em vários lugares, criei um .qvs e estou inserindo via "Arquivo de Script", existe outra alternativa ? criando uma função/módulo? queria reaproveitar o código.
Olá,
Muito bom cara, vai ser muito útil nos projetos aqui.
Obrigado por compartilhar.
Abs,
Excelente, bem o que estava procurando!
Usando a função Upper poderá declarar apenas os caracteres maiúsculos, irá ajudar na performance.
[Map_Remove_Acento]:
Mapping
LOAD * INLINE [
DE, PARA
Š, S
Ž, Z
À, A
Á, A
Â, A
Ã, A
Ä, A
Å, A
Æ, A
Ç, C
È, E
É, E
Ê, E
Ë, E
Ì, I
Í, I
Î, I
Ï, I
Ñ, N
Ò, O
Ó, O
Ô, O
Õ, O
Ö, O
Ø, O
Ù, U
Ú, U
Û, U
Ü, U
Ý, Y
Þ, B
ß, B
];
//--------------------------
LOAD
*,
MapSubString('Map_Remove_Acento', Trim(Upper("Rua"))) AS 'Rua S/a'
;