como pegar cada palavra em um texto

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Gustavo ledo
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Qui, 18 Jun 2009 3:15 pm
Localização: Niteroi RJ

Olá,

preciso de um procedimento para pegar cada palavra em um texto do tipo CLOB.
estou usando instr(valor, ' ') para pegar os espaços em branco sendo assim pegando cada palavra em um procedimento recursivo....

alguém tem alguma outra idéia ou dica?

sds
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Aí, Gustavo! As versões mais recentes do Oracle têm aquele esquema que todo mundo odiava na faculdade, mas que finalmente serve pra alguma coisa: expressões regulares! :-o

Então, usando expressões regulares, dá pra extrair padrões muito fácil, e no seu caso fica um código extremamente eficiente e simples:

Selecionar tudo

SQL> set serveroutput on
SQL> declare
  2    v_str varchar2(100) := 'Como pegar\cada palavra*em um-texto?';
  3    v_retorno varchar2(100);
  4    v_print varchar2(100);
  5    k number;
  6  begin
  7    v_retorno := translate(v_str, '*/\.!?,;-', '         ');
  8    k := 1;
  9    while regexp_substr(v_retorno, '\w+', 1, k, 'i') is not null
 10    loop
 11      v_print := regexp_substr(v_retorno, '\w+', 1, k);
 12      dbms_output.put_line('Palavra ' || k || ': ' || v_print);
 13      k := k + 1;
 14    end loop;
 15  end;
 16  /
Palavra 1: Como
Palavra 2: pegar
Palavra 3: cada
Palavra 4: palavra
Palavra 5: em
Palavra 6: um
Palavra 7: texto

Procedimento PL/SQL concluído com sucesso.

SQL> 
Dá uma olhada aí, tem alguma coisa de documentação no link
http://download.oracle.com/docs/cd/B193 ... SQLRF06303
e no
http://download.oracle.com/docs/cd/B193 ... #sthref534

Se quiser mexer mais algumas coisas dá um grito aqui que vamos tentando. Eu só fiz um exemplo, então você pode ter que adicionar mais caracteres no translate (porque sou meio n00b nos regular expressions ainda) ou melhorar a expressão pra refinar mais, se você achar algum caso de erro. Mas a idéia é essa!

Abraço,
Francisco.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Muito bom !!!
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Valeu Thomas, minha professora de linguagens formais e autômatos deve estar orgulhosa hehe :lol:

Só complementando, o translate nem precisa, pode tirar, eu tava com a cabeça viajando em outra solução quando coloquei. Explicando: translate só "limpa" os caracteres esquisitos e coloca um espaço branco no lugar, mas a expressão regular \w+ busca por palavras (words, o "+" indica que são palavras consecutivas sem limite de repetição), e pula os símbolos de qualquer jeito, independente do que estiver entre as palavras. Eu estava fazendo anteriormente \S+ com o translate, o que quer dizer que ele vai pegar tudo o que não for espaço em branco. Dá na mesma, mas é mais trabalho porque precisa do translate.

Selecionar tudo

SQL> set serveroutput on
SQL> declare
  2    v_str varchar2(100) := 'Como pegar*\cada     . palavra*em um-texto?';
  3    v_retorno varchar2(100);
  4    v_print varchar2(100);
  5    k number;
  6  begin
  7    v_retorno := translate(v_str, '*/\.!?,;-()', '           ');
  8    --v_retorno := v_str;
  9    k := 1;
 10    while regexp_substr(v_retorno, '\S+', 1, k, 'i') is not null
 11    loop
 12      v_print := regexp_substr(v_retorno, '\S+', 1, k);
 13      dbms_output.put_line('Palavra ' || k || ': ' || v_print);
 14      k := k + 1;
 15    end loop;
 16  end;
 17  /
Palavra 1: Como
Palavra 2: pegar
Palavra 3: cada
Palavra 4: palavra
Palavra 5: em
Palavra 6: um
Palavra 7: texto

Procedimento PL/SQL concluído com sucesso.

SQL> 
Responder
  • Informação