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
como pegar cada palavra em um texto
-
- Rank: Estagiário Júnior
- Mensagens: 1
- Registrado em: Qui, 18 Jun 2009 3:15 pm
- Localização: Niteroi RJ
- fsitja
- 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
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!
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:
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.

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:
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>
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.
- fsitja
- 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
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 
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.

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.
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>
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante