ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Ajuda com função fonética

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
jjmalka
Aprendiz
Aprendiz


Registrado: Domingo, 16 de Julho de 2006
Mensagens: 157

MensagemEnviada: Qua Nov 04, 2015 9:17 pm    Assunto: Ajuda com função fonética Responder com Citação

Boa noite.
Alguém poderia me ajudar com uma função fonética /?
falta a parte que apague a ultima letra de um nome de acordo com as condições impostas

Exemplo:
Eliminar as terminações S, Z, R, R, M, N, AO e L;

nome para exemplo:
* Manoel José da Silva Santos.

Apos passar na funçao ficaria:

Manoe Jose Silva Santo

To tentando implementar a funçao de fonética da BuscaBR e esta faltando esta parte.

Caso alguem possua mais alguma ideia para melhorar a função ou diminuir o codigo será bem vinda!

Segue as regras da função:

. Converter todas as letras para Maiúsculo;
2. Eliminar todos os acentos;
3. Substituir Y por I;
4. Substituir BR por B;
5. Substituir PH por F;
6. Substituir GR, MG, NG, RG por G;
7. Substituir GE, GI, RJ, MJ, NJ por J;
8. Substituir Q, CA, CO, CU, C por K;
9. Substituir LH por L;
10. Substituir N, RM, GM, MD, SM e Terminação AO por M;
11. Substituir NH por N;
12. Substituir PR por P;
13. Substituir Ç, X, TS, C, Z, RS por S;
14. Substituir LT, TR, CT, por T;
15. Substituir W por V;
16. Eliminar as terminações S, Z, R, R, M, N, AO e L;
17. Substituir R por L;
18. Eliminar todas as vogais e o H;
19. Eliminar todas as letras em duplicidade;





Código:
Function SOUNDEX_BUSCA_BR_ADAPTADO(N: string): string;
var

  LP: TStringList; // declaração de lista de string ou stringlist
  i: integer; // declaraçao de valor inteiro
  S: string; // declaração de variavel string auxiliar

Begin
  // A string N será repassada no momento da solicitação da função...

  if trim(N) = '' then // se a string for igual a vazio para o processo !!!
  begin
    exit;
  end;

  LP := TStringList.Create; // cria uma stringlist…

  try
    S := AnsiUpperCase(N); // todas as letras maiúsculas e armazena na string s

    for i := 1 to length(S) do
      if S[i] in ['Á', 'Ã', 'À', 'Â', 'Ä'] then // retira todos os acentos da vogal “A”
        S := copy(S, 1, i - 1) + 'A' + copy(S, i + 1, 255)
      Else
         if S[i] in ['É', 'È', 'Ê', 'Ë'] then // retira todos os acentos da vogal “E”
        S := copy(S, 1, i - 1) + 'E' + copy(S, i + 1, 255)
      Else
         if S[i] in ['Í', 'Ì', 'Î', 'Ï'] then // retira todos os acentos da vogal “I”
        S := copy(S, 1, i - 1) + 'I' + copy(S, i + 1, 255)
      Else
         if S[i] in ['Ó', 'Õ', 'Ò', 'Ô', 'Ö'] then // retira todos os acentos da vogal “O”
        S := copy(S, 1, i - 1) + 'O' + copy(S, i + 1, 255)
      Else
         if S[i] in ['Ú', 'Ù', 'Û', 'Ü'] then // retira todos os acentos da vogal “U”
        S := copy(S, 1, i - 1) + 'U' + copy(S, i + 1, 255)
      Else
         if S[i] in ['Ñ'] then // retira todos os acentos da consoante “N”
        S := copy(S, 1, i - 1) + 'N' + copy(S, i + 1, 255)
      Else
         if S[i] in ['Ç'] then // TRANSFORMA cedilha EM C
        S := copy(S, 1, i - 1) + 'C' + copy(S, i + 1, 255)
      Else

         if S[i] in ['.'] then // RETIRA O PONTO
        S := copy(S, 1, i - 1) + ' ' + copy(S, i + 1, 255)
      Else
         if S[i] in ['-'] then // RETIRA O HIFEN
        S := copy(S, 1, i - 1) + ' ' + copy(S, i + 1, 255)
      Else
         if S[i] in [''''] then // RETIRA ASPAS DUPLAS
        S := copy(S, 1, i - 1) + copy(S, i + 1, 255)
      Else
         if S[i] in [';'] then // RETIRA PONTO E VIRGULA
        S := copy(S, 1, i - 1) + copy(S, i + 1, 255)
      Else
         if S[i] in [','] then // RETIRA VIRGULA
        S := copy(S, 1, i - 1) + copy(S, i + 1, 255)
      Else
         if S[i] in [':'] then // RETIRA DOIS PONTOS
        S := copy(S, 1, i - 1) + copy(S, i + 1, 255)
      Else

         if S[i] in ['0'] then // RETIRA numero zero
        S := copy(S, 1, i - 1) + copy(S, i + 1, 255)
      Else
         if S[i] in ['1'] then // RETIRA numero um
        S := copy(S, 1, i - 1) + copy(S, i + 1, 255)
      Else
         if S[i] in ['2'] then // RETIRA numero dois
        S := copy(S, 1, i - 1) + copy(S, i + 1, 255)
      Else
         if S[i] in ['3'] then // RETIRA numero tres
        S := copy(S, 1, i - 1) + copy(S, i + 1, 255)
      Else
         if S[i] in ['4'] then // RETIRA numero quatro
        S := copy(S, 1, i - 1) + copy(S, i + 1, 255)
      Else
         if S[i] in ['5'] then // RETIRA numero cinco
        S := copy(S, 1, i - 1) + copy(S, i + 1, 255)
      Else
         if S[i] in ['6'] then // RETIRA numero seis
        S := copy(S, 1, i - 1) + copy(S, i + 1, 255)
      Else
         if S[i] in ['7'] then // RETIRA numero sete
        S := copy(S, 1, i - 1) + copy(S, i + 1, 255)
      Else
         if S[i] in ['8'] then // RETIRA numero oito
        S := copy(S, 1, i - 1) + copy(S, i + 1, 255)
      Else
         if S[i] in ['9'] then // RETIRA numero nove
        S := copy(S, 1, i - 1) + copy(S, i + 1, 255);
    LP := SplitWord(S, ' ?');

    if length(LP[0]) >= 1 then
    begin
      for i := LP.Count - 1 downto 0 do
        if length(LP[i]) = 1 then
          LP.Delete(i);

      if LP.Count >= 1 then // RETIRA PREPOSIÇÕES
      begin
        for i := LP.Count - 1 downto 0 do
          if (LP[i] = 'DA') or
             (LP[i] = 'DE') or
             (LP[i] = 'DI') or
             (LP[i] = 'DO') or
             (LP[i] = 'DU') or
             (LP[i] = 'DR') or
             (LP[i] = 'DAS') or
             (LP[i] = 'DOS') or
             (LP[i] = 'DAL') or
             (LP[i] = 'DEL') or
             (LP[i] = 'DER') or
             (LP[i] = 'LA') or
             (LP[i] = 'LE') or
             (LP[i] = 'LO') or
             (LP[i] = 'LAS') or
             (LP[i] = 'LES') or
             (LP[i] = 'LOS') or
             (LP[i] = 'VAN') or
             (LP[i] = 'VON') or
             (LP[i] = 'EL') then
            LP.Delete(i);
      end;

      if LP.Count >= 1 then // RETIRA TITULOS
      begin
        if (LP[0] = 'CAP') or
           (LP[0] = 'CAPITAO') or
           (LP[0] = 'CEL') or
           (LP[0] = 'CORONEL') or
           (LP[0] = 'GAL') or
           (LP[0] = 'GEN') or
           (LP[0] = 'GENERAL') or
           (LP[0] = 'MAJ') or
           (LP[0] = 'MAJOR') or
           (LP[0] = 'SARG') or
           (LP[0] = 'SARGENTO') or
           (LP[0] = 'TEN') or
           (LP[0] = 'TENENTE') or
           (LP[0] = 'BEL') or
           (LP[0] = 'BACHAR') or
           (LP[0] = 'BACHAREL') or
           (LP[0] = 'DR') or
           (LP[0] = 'DOUTOR') or
           (LP[0] = 'DRA') or
           (LP[0] = 'DOUTORA') or
           (LP[0] = 'ENG') or
           (LP[0] = 'ENGENHEIRO') or
           (LP[0] = 'ENGENHEIRA') or
           (LP[0] = 'MED') or
           (LP[0] = 'MEDICO') or
           (LP[0] = 'PROF') or
           (LP[0] = 'PROFESSOR') or
           (LP[0] = 'PE') or
           (LP[0] = 'PADRE') or
           (LP[0] = 'VIUVA') or
           (LP[0] = 'VVA') then
          if LP.Count >= 3 then
            LP.Delete(0);
      end;

      if LP.Count >= 1 then // RETIRADA DE PALAVRAS QUE ASSOCIAM AO NOME ERRONEAMENTE…
      begin
        if
        // (LP[LP.Count-1] = 'FILHO') or //RETIRADA POR EXISTIR SOBRENOME
           (LP[LP.Count - 1] = 'FILHA') or
           (LP[LP.Count - 1] = 'FA') or
           (LP[LP.Count - 1] = 'FO') or
           (LP[LP.Count - 1] = 'FILHOS') or
           (LP[LP.Count - 1] = 'FILHAS') or
        // (LP[LP.Count-1] = 'NETO') or //RETIRADA POR EXISTIR SOBRENOME
        // (LP[LP.Count-1] = 'NETA') or //RETIRADA POR EXISTIR SOBRENOME
           (LP[LP.Count - 1] = 'NETTO') or
           (LP[LP.Count - 1] = 'NETTA') or
           (LP[LP.Count - 1] = 'BISNETO') or
           (LP[LP.Count - 1] = 'BISNETA') or
           (LP[LP.Count - 1] = 'BISNETTO') or
           (LP[LP.Count - 1] = 'BISNETTA') or
           (LP[LP.Count - 1] = 'BISNET') or
           (LP[LP.Count - 1] = 'PRIMO') or
           (LP[LP.Count - 1] = 'PRIMA') or
           (LP[LP.Count - 1] = 'SOB') or
           (LP[LP.Count - 1] = 'SOBRIN') or
           (LP[LP.Count - 1] = 'SOBRINHO') or
           (LP[LP.Count - 1] = 'SOBRINHA') or
           (LP[LP.Count - 1] = 'IRMAO') or
           (LP[LP.Count - 1] = 'IRMAOS') or
           (LP[LP.Count - 1] = 'SEGUND') or
           (LP[LP.Count - 1] = 'SEGUNDO') or
           (LP[LP.Count - 1] = 'TERCEIRO') or
           (LP[LP.Count - 1] = 'TERCEIRA') or
           (LP[LP.Count - 1] = 'JUNIOR') or
           (LP[LP.Count - 1] = 'JR') then
          if LP.Count >= 3 then
            LP.Delete(LP.Count - 1);
      end;

      S := ''; // LIMPA A VARIAVEL  COM A STRING FINAL…

      for i := 0 to LP.Count - 1 do
        if S = '' then
          S := LP[i]
        else
          S := S + ' ' + LP[i];

      // armazena a string principal “S” com o valor final depois de tratada…


      // INICIA A FASE FINAL DA CODIFICAÇAO FONÉTICA...
      // INICIO DO SOUNDEX_BUSCA_BR_ADAPTADO_JJMALKA
      // COMO RETORNA ACIMA A STRING “S” TRATO DA MESMA FORMA DO INICIO DA ANALISE...CONTO QUANTOS CARACTERES SOBRARAM E RODO O SOUNDEX NO RESTANTE DA STRING...

      for i := 1 to length(S) do
        if S[i] in ['AO'] then // substitui o “AO” pela  “M”
          S := copy(S, 1, i - 1) + 'M' + copy(S, i + 1, 255)
        Else
           if S[i] in ['BR'] then // substitui o “BR” pela “B”
          S := copy(S, 1, i - 1) + 'B' + copy(S, i + 1, 255)
        Else
           if S[i] in ['C'] then // substitui o “C” pela “S”
          S := copy(S, 1, i - 1) + 'S' + copy(S, i + 1, 255)
        Else

           if S[i] in ['CA'] then // substitui o “CA” pela “K”
          S := copy(S, 1, i - 1) + 'K' + copy(S, i + 1, 255)
        Else
           if S[i] in ['CO'] then // substitui o “CO” pela “K”
          S := copy(S, 1, i - 1) + 'K' + copy(S, i + 1, 255)
        Else
           if S[i] in ['CU'] then // substitui o “CU” pela “K”
          S := copy(S, 1, i - 1) + 'K' + copy(S, i + 1, 255)
        Else // NAO TEM Ç POIS MUDA ANTERIORMENTE PARA C.
          if S[i] in ['CH'] then // substitui o “CH” pela  “S”
            S := copy(S, 1, i - 1) + 'S' + copy(S, i + 1, 255)
          Else
             if S[i] in ['CT'] then // substitui o “CT” pela “T”
            S := copy(S, 1, i - 1) + 'T' + copy(S, i + 1, 255)
          Else
             if S[i] in ['GE'] then // substitui o “GE” pela  “J”
            S := copy(S, 1, i - 1) + 'J' + copy(S, i + 1, 255)
          Else
             if S[i] in ['GI'] then // substitui o “GI” pela  “J”
            S := copy(S, 1, i - 1) + 'J' + copy(S, i + 1, 255)
          Else
             if S[i] in [‘ GM ’] then // substitui o “GM” pela  “M”
            S := copy(S, 1, i - 1) + 'M' + copy(S, i + 1, 255)
          Else
             if S[i] in ['GR'] then // substitui o “GR” pela “G”
            S := copy(S, 1, i - 1) + 'G' + copy(S, i + 1, 255)
          Else
             if S[i] in ['LH'] then // substitui o “LH” pela “L”
            S := copy(S, 1, i - 1) + 'L' + copy(S, i + 1, 255)
          Else
             if S[i] in ['LT'] then // substitui o “LT” pela “T”
            S := copy(S, 1, i - 1) + 'T' + copy(S, i + 1, 255)
          Else
             if S[i] in ['MD'] then // substitui o “MD” pela  “M”
            S := copy(S, 1, i - 1) + 'M' + copy(S, i + 1, 255)
          Else
             if S[i] in ['MG'] then // substitui o “MG” pela “G”
            S := copy(S, 1, i - 1) + 'G' + copy(S, i + 1, 255)
          Else
             if S[i] in ['MJ'] then // substitui o “MJ” pela  “J”
            S := copy(S, 1, i - 1) + 'J' + copy(S, i + 1, 255)
          Else
             if S[i] in ['N'] then // substitui o “N” pela “M”
            S := copy(S, 1, i - 1) + 'M' + copy(S, i + 1, 255)
          Else
             if S[i] in ['NG'] then // substitui o “NG” pela  “G”
            S := copy(S, 1, i - 1) + 'G' + copy(S, i + 1, 255)
          Else
             if S[i] in ['NH'] then // substitui o “NH” pela  “N”
            S := copy(S, 1, i - 1) + 'N' + copy(S, i + 1, 255)
          Else
             if S[i] in ['NJ'] then // substitui o “NJ” pela  “J”
            S := copy(S, 1, i - 1) + 'J' + copy(S, i + 1, 255)

          Else
             if S[i] in ['PH'] then // substitui o “PH” pela “F”
            S := copy(S, 1, i - 1) + 'F' + copy(S, i + 1, 255)
          Else
             if S[i] in ['PR'] then // substitui o “PR” pela  “P”
            S := copy(S, 1, i - 1) + 'P' + copy(S, i + 1, 255)
          Else
             if S[i] in ['Q'] then // substitui o “Q” pela  “K”
            S := copy(S, 1, i - 1) + 'K' + copy(S, i + 1, 255)
          Else
             if S[i] in ['RG'] then // substitui o “RG” pela  “G”
            S := copy(S, 1, i - 1) + 'G' + copy(S, i + 1, 255)
          Else
             if S[i] in ['RS'] then // substitui o “RS” pela vogal “S”
            S := copy(S, 1, i - 1) + 'S' + copy(S, i + 1, 255)
          Else
             if S[i] in ['RM'] then // substitui o “RM” pela “M”
            S := copy(S, 1, i - 1) + 'M' + copy(S, i + 1, 255)
          Else
             if S[i] in ['RJ'] then // substitui o “RJ” pela  “J”
            S := copy(S, 1, i - 1) + 'J' + copy(S, i + 1, 255)
          Else
             if S[i] in ['SM'] then // substitui o “SM” pela  “M”
            S := copy(S, 1, i - 1) + 'M' + copy(S, i + 1, 255)
          Else
             if S[i] in ['TR'] then // substitui o “TR” pela  “T”
            S := copy(S, 1, i - 1) + 'T' + copy(S, i + 1, 255)
          Else
             if S[i] in ['TS'] then // substitui o “TS” pela  “S”
            S := copy(S, 1, i - 1) + 'S' + copy(S, i + 1, 255)
          Else
             if S[i] in ['W'] then // substitui o “W” pela  “V”
            S := copy(S, 1, i - 1) + 'V' + copy(S, i + 1, 255)
          Else
             if S[i] in ['X'] then // substitui o “X” pela  “S”
            S := copy(S, 1, i - 1) + 'S' + copy(S, i + 1, 255)
          Else
             if S[i] in ['Y'] then // substitui o “Y” pela  “I”
            S := copy(S, 1, i - 1) + 'I' + copy(S, i + 1, 255)
          Else
             if S[i] in ['Z'] then // substitui o “Z” pela “S”
            S := copy(S, 1, i - 1) + 'S' + copy(S, i + 1, 255)

            // BLOCO FINAL DO SOUNDEX…

            // Eliminar as terminações S, Z, R, R, M, N, AO e L;

            {
              Bloco com função para apagar ultima letra no nome...
            }

            // FALTA VER ESTA FUNÇAO: APAGAR ULTIMO CARACTER

            // INICIO DA RETIRADA DE LETRAS DUPLICADAS…
      if S[i] in ['AA'] then // substitui o “AA” pela  “A”
        S := copy(S, 1, i - 1) + 'B' + copy(S, i + 1, 255)
      Else
         if S[i] in ['BB'] then // substitui o “BB” pela “B”
        S := copy(S, 1, i - 1) + 'B' + copy(S, i + 1, 255)
      Else
         if S[i] in ['CC'] then // substitui o “CC” pela “C”
        S := copy(S, 1, i - 1) + 'C' + copy(S, i + 1, 255)
      Else
         if S[i] in ['DD'] then // substitui o “DD” pela “D”
        S := copy(S, 1, i - 1) + 'D' + copy(S, i + 1, 255)
      Else
         if S[i] in ['EE'] then // substitui o “EE” pela  “E”
        S := copy(S, 1, i - 1) + 'E' + copy(S, i + 1, 255)
      Else
         if S[i] in ['FF'] then // substitui o “FF” pela “F”
        S := copy(S, 1, i - 1) + 'F' + copy(S, i + 1, 255)
      Else
         if S[i] in ['GG'] then // substitui o “GG” pela “G”
        S := copy(S, 1, i - 1) + 'G' + copy(S, i + 1, 255)
      Else
         if S[i] in ['HH'] then // substitui o “HH” pela “H”
        S := copy(S, 1, i - 1) + 'H' + copy(S, i + 1, 255)
      Else
         if S[i] in ['II'] then // substitui o “II” pela “I”
        S := copy(S, 1, i - 1) + 'I' + copy(S, i + 1, 255)
      Else
         if S[i] in ['JJ'] then // substitui o “JJ” pela “J”
        S := copy(S, 1, i - 1) + 'J' + copy(S, i + 1, 255)
      Else
         if S[i] in ['KK'] then // substitui o “KK” pela “K”
        S := copy(S, 1, i - 1) + 'K' + copy(S, i + 1, 255)
      Else
         if S[i] in ['LL'] then // substitui o “LL” pela “L”
        S := copy(S, 1, i - 1) + 'L' + copy(S, i + 1, 255)
      Else
         if S[i] in ['MM'] then // substitui o “MM” pela “M”
        S := copy(S, 1, i - 1) + 'M' + copy(S, i + 1, 255)
      Else
         if S[i] in ['NN'] then // substitui o “NN” pela “N”
        S := copy(S, 1, i - 1) + 'N' + copy(S, i + 1, 255)
      Else
         if S[i] in ['OO'] then // substitui o “OO” pela “O”
        S := copy(S, 1, i - 1) + 'O' + copy(S, i + 1, 255)
      Else
         if S[i] in ['PP'] then // substitui o “PP” pela “P”
        S := copy(S, 1, i - 1) + 'P' + copy(S, i + 1, 255)
      Else
         if S[i] in ['QQ'] then // substitui o “QQ” pela “Q”
        S := copy(S, 1, i - 1) + 'Q' + copy(S, i + 1, 255)
      Else
         if S[i] in ['RR'] then // substitui o “RR” pela “R”
        S := copy(S, 1, i - 1) + 'R' + copy(S, i + 1, 255)
      Else
         if S[i] in ['SS'] then // substitui o “SS” pela “S”
        S := copy(S, 1, i - 1) + 'S' + copy(S, i + 1, 255)
      Else
         if S[i] in ['TT'] then // substitui o “TT” pela “T”
        S := copy(S, 1, i - 1) + 'T' + copy(S, i + 1, 255)
      Else
         if S[i] in ['UU'] then // substitui o “UU” pela “U”
        S := copy(S, 1, i - 1) + 'U' + copy(S, i + 1, 255)
      Else
         if S[i] in ['VV'] then // substitui o “VV” pela “V”
        S := copy(S, 1, i - 1) + 'V' + copy(S, i + 1, 255)
      Else
         if S[i] in ['WW'] then // substitui o “WW” pela “W”
        S := copy(S, 1, i - 1) + 'W' + copy(S, i + 1, 255)
      Else
         if S[i] in ['XX'] then // substitui o “XX” pela “X”
        S := copy(S, 1, i - 1) + 'X' + copy(S, i + 1, 255)
      Else
         if S[i] in ['YY'] then // substitui o “YY” pela “Y”
        S := copy(S, 1, i - 1) + 'Y' + copy(S, i + 1, 255)
      Else
         if S[i] in ['ZZ'] then // substitui o “ZZ” pela “Z”
        S := copy(S, 1, i - 1) + 'Z' + copy(S, i + 1, 255)

        // FINAL DE ANALISE DE CARACTERES DUPLICADOS…

        // Eliminar todas as vogais restantes e mais o H

      Else
         if S[i] in ['A'] then // Apaga A
        S := copy(S, 1, i - 1) + '' + copy(S, i + 1, 255)
      Else
         if S[i] in ['E'] then // Apaga E
        S := copy(S, 1, i - 1) + '' + copy(S, i + 1, 255)
      Else
         if S[i] in ['I'] then // Apaga I
        S := copy(S, 1, i - 1) + '' + copy(S, i + 1, 255)
      Else
         if S[i] in ['O'] then // Apaga O
        S := copy(S, 1, i - 1) + '' + copy(S, i + 1, 255)
      Else
         if S[i] in ['U'] then // Apaga U
        S := copy(S, 1, i - 1) + '' + copy(S, i + 1, 255)

        // MAIS A CONSOANTE “H”
      Else
         if S[i] in ['H'] then // Apaga H
        S := copy(S, 1, i - 1) + '' + copy(S, i + 1, 255);


      // FINAL DA ANALISE FONÉTICA…

    end;
  finally
    LP.Free;
  end;
  Result := S;
end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Qui Nov 05, 2015 1:38 am    Assunto: Responder com Citação

Código:
Function SOUNDEX_BUSCA_BR_ADAPTADO(N: string): string;

const
  REGRA: array [1 .. 36,1 .. 2] of string = (
  {01º}('Y','I'),
  {02º}('BR','B'),
  {03º}('PH','F'),
  {04º}('GR','G'), ('MG','G'), ('NG','G'), ('RG','G'),
  {05º}('GE','J'), ('GI','J'), ('RJ','J'), ('MJ','J'), ('NJ', 'J'),
  {06º}('Q' ,'K'), ('CA','K'), ('CO','K'), ('CU','K'), ('C','K'),
  {07º}('LH','L'),
  {08º}('N','M'), ('RM','M'), ('GM','M'), ('MD','M'),('SM','M'), ('AO','M'),
  {09º}('NH','N'),
  {10º}('PR','P'),
  {11º}('Ç','S'), ('X','S'), ('TS','S'), ('C','S'), ('Z','S'), ('RS','S'),
  {12º}('LT','T'),('TR','T'),('CT','T'),
  {13º}('W','V'));

  PREPOSICOES:array[1..20] of string=(
    'DA' , 'DE' , 'DI' , 'DO' , 'DU' , 'DR' , 'DAS', 'DOS',
    'DAL', 'DEL', 'DER', 'LA' , 'LE' , 'LO' , 'LAS', 'LES',
    'LOS', 'VAN', 'VON', 'EL');

  TITULOS:array[1..31] of string=(
    'CAP'       , 'CAPITAO'   , 'CEL'       , 'CORONEL' ,
    'GAL'       , 'GEN'       , 'GENERAL'   , 'MAJ'     ,
    'MAJOR'     , 'SARG'      , 'SARGENTO'  , 'TEN'     ,
    'TENENTE'   , 'BEL'       , 'BACHAR'    , 'BACHAREL',
    'DR'        , 'DOUTOR'    , 'DRA'       , 'DOUTORA' ,
    'ENG'       , 'ENGENHEIRO', 'ENGENHEIRA', 'MED'     ,
    'MEDICO'    , 'PROF'      , 'PROFESSOR' , 'PE'      ,
    'PADRE'     , 'VIUVA'     , 'VVA' );

  SOBRENOMES:array[1..26] of string=(
    'FILHA'   , 'FA'      , 'FO'      , 'FILHOS'  , 'FILHAS'  ,
    'NETTO'   , 'NETTA'   , 'BISNETO' , 'BISNETA' , 'BISNETTO',
    'BISNETTA', 'BISNET'  , 'PRIMO'   , 'PRIMA'   , 'SOB'     ,
    'SOBRIN'  , 'SOBRINHO', 'SOBRINHA', 'IRMAO'   , 'IRMAOS'  ,
    'SEGUND'  , 'SEGUNDO' , 'TERCEIRO', 'TERCEIRA', 'JUNIOR'  ,
    'JR');

    TERMINACOES:array[1..7] of string=(
    'S', 'Z', 'R', 'M', 'N', 'AO', 'L');

var
  i: integer; // declaraçao de valor inteiro
Begin

  // A string N será repassada no momento da solicitação da função...
  if trim(N) = '' then // se a string for igual a vazio para o processo !!!
    exit;

  // todas as letras maiúsculas
  N := ' '+AnsiUpperCase(N)+' ';
  for i := 1 to length(N) do
  begin
    // retira todos os acentos da vogal “A”
    if N[i] in ['Á', 'Ã', 'À', 'Â', 'Ä'] then N[i] := 'A';
    // retira todos os acentos da vogal “E”
    if N[i] in ['É', 'È', 'Ê', 'Ë'] then N[i] := 'E';
    // retira todos os acentos da vogal “I”
    if N[i] in ['Í', 'Ì', 'Î', 'Ï'] then N[i] := 'I';
    // retira todos os acentos da vogal “O”
    if N[i] in ['Ó', 'Õ', 'Ò', 'Ô', 'Ö'] then N[i] := 'O';
    // retira todos os acentos da vogal “U”
    if N[i] in ['Ú', 'Ù', 'Û', 'Ü'] then N[i] := 'U';
    // retira todos os acentos da consoante “N”
    if N[i] = 'Ñ' then N[i] := 'N';
    // TRANSFORMA cedilha EM C
    if N[i] = 'Ç' then N[i] := 'C';
    // retira caracteres que não pertença ao conjunto 'A'..'Z' e ' '
    if not(N[i] in ['A' .. 'Z', ' ']) then delete(N, i, 1);
  end;

  // RETIRA PREPOSIÇÕES
  for i := Low(PREPOSICOES) to High(PREPOSICOES) do
    N:=StringReplace(N,' '+PREPOSICOES[i]+' ',' ',[rfReplaceAll]);

  // RETIRA TITULOS
  for i := Low(TITULOS) to High(TITULOS) do
    N:=StringReplace(N,' '+TITULOS[i]+' ',' ',[rfReplaceAll]);

  // RETIRADA DE PALAVRAS QUE ASSOCIAM AO NOME ERRONEAMENTE…
  for i := Low(SOBRENOMES) to High(SOBRENOMES) do
    N:=StringReplace(N,' '+SOBRENOMES[i]+' ',' ',[rfReplaceAll]);

  // *** INICIA A FASE FINAL DA CODIFICAÇAO FONÉTICA...
  // *** INICIO DO SOUNDEX_BUSCA_BR_ADAPTADO_JJMALKA
  // *** COMO RETORNA ACIMA A STRING “S” TRATO DA MESMA FORMA DO INICIO
  // *** DA ANALISE...CONTO QUANTOS CARACTERES SOBRARAM E RODO O
  // *** SOUNDEX NO RESTANTE DA STRING...

  for i := Low(REGRA) to High(REGRA) do
    N:=StringReplace(N,REGRA[i,1],REGRA[i,2],[rfReplaceAll]);

  // **********  BLOCO FINAL DO SOUNDEX… ************

  // Eliminar as terminações S, Z, R, R, M, N, AO e L;
  for i := Low(TERMINACOES) to High(TERMINACOES) do
    N:=StringReplace(N,TERMINACOES[i]+' ',' ',[rfReplaceAll]);

  // INICIO DA RETIRADA DE LETRAS DUPLICADAS…
  for I := ord('A') to ord('Z') do
    N:=StringReplace(N,chr(i)+chr(i),chr(i),[rfReplaceAll]);
  // FINAL DE ANALISE DE CARACTERES DUPLICADOS…

  // Eliminar todas as vogais restantes e mais o H

  //N:=StringReplace(N,'A','',[rfReplaceAll]);
  //N:=StringReplace(N,'E','',[rfReplaceAll]);
  //N:=StringReplace(N,'I','',[rfReplaceAll]);
  //N:=StringReplace(N,'O','',[rfReplaceAll]);
  //N:=StringReplace(N,'U','',[rfReplaceAll]);

  // MAIS A CONSOANTE “H”
  N:=StringReplace(N,'H','',[rfReplaceAll]);

  // *** FINAL DA ANALISE FONÉTICA…
  Result := trim(N);

end;


falta alguma logica ai nesta interpretação das regras
no final ele pede para deletar todas as vogais e o H.
como assim?
explica e como
Código:
Manoel José da Silva Santos.

passa a ser
Código:
Manoe Jose Silva Santo

sem uso de vogais.

Uma outra falta é que em algum momento das regras ele pede para trocar N por M logo o nome Manoel passaria a ser Mamoe

de qualquer forma deixei de forma comentada a questão da vogais e deixei o codigo de facil alteração e ajuste futura caso nescessite.
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
conorte
Experiente
Experiente


Registrado: Quinta-Feira, 8 de Mai de 2014
Mensagens: 406
Localização: Porto Alegre/RS

MensagemEnviada: Qui Nov 05, 2015 7:38 am    Assunto: Responder com Citação

Olá!
Eu também fiquei com dúvida sobre tirar o "L" de Manoel e "S" de Santos. E também fiquei com dúvida em outras substituições que "desfigurariam" a palavra deixando-a "irreconhecível".
_________________
Luciano Moraes
1º curso de Pascal em 1998.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
jjmalka
Aprendiz
Aprendiz


Registrado: Domingo, 16 de Julho de 2006
Mensagens: 157

MensagemEnviada: Qui Nov 05, 2015 9:34 pm    Assunto: Responder com Citação

strak2012 escreveu:
Código:
Function SOUNDEX_BUSCA_BR_ADAPTADO(N: string): string;

const
  REGRA: array [1 .. 36,1 .. 2] of string = (
  {01º}('Y','I'),
  {02º}('BR','B'),
  {03º}('PH','F'),
  {04º}('GR','G'), ('MG','G'), ('NG','G'), ('RG','G'),
  {05º}('GE','J'), ('GI','J'), ('RJ','J'), ('MJ','J'), ('NJ', 'J'),
  {06º}('Q' ,'K'), ('CA','K'), ('CO','K'), ('CU','K'), ('C','K'),
  {07º}('LH','L'),
  {08º}('N','M'), ('RM','M'), ('GM','M'), ('MD','M'),('SM','M'), ('AO','M'),
  {09º}('NH','N'),
  {10º}('PR','P'),
  {11º}('Ç','S'), ('X','S'), ('TS','S'), ('C','S'), ('Z','S'), ('RS','S'),
  {12º}('LT','T'),('TR','T'),('CT','T'),
  {13º}('W','V'));

  PREPOSICOES:array[1..20] of string=(
    'DA' , 'DE' , 'DI' , 'DO' , 'DU' , 'DR' , 'DAS', 'DOS',
    'DAL', 'DEL', 'DER', 'LA' , 'LE' , 'LO' , 'LAS', 'LES',
    'LOS', 'VAN', 'VON', 'EL');

  TITULOS:array[1..31] of string=(
    'CAP'       , 'CAPITAO'   , 'CEL'       , 'CORONEL' ,
    'GAL'       , 'GEN'       , 'GENERAL'   , 'MAJ'     ,
    'MAJOR'     , 'SARG'      , 'SARGENTO'  , 'TEN'     ,
    'TENENTE'   , 'BEL'       , 'BACHAR'    , 'BACHAREL',
    'DR'        , 'DOUTOR'    , 'DRA'       , 'DOUTORA' ,
    'ENG'       , 'ENGENHEIRO', 'ENGENHEIRA', 'MED'     ,
    'MEDICO'    , 'PROF'      , 'PROFESSOR' , 'PE'      ,
    'PADRE'     , 'VIUVA'     , 'VVA' );

  SOBRENOMES:array[1..26] of string=(
    'FILHA'   , 'FA'      , 'FO'      , 'FILHOS'  , 'FILHAS'  ,
    'NETTO'   , 'NETTA'   , 'BISNETO' , 'BISNETA' , 'BISNETTO',
    'BISNETTA', 'BISNET'  , 'PRIMO'   , 'PRIMA'   , 'SOB'     ,
    'SOBRIN'  , 'SOBRINHO', 'SOBRINHA', 'IRMAO'   , 'IRMAOS'  ,
    'SEGUND'  , 'SEGUNDO' , 'TERCEIRO', 'TERCEIRA', 'JUNIOR'  ,
    'JR');

    TERMINACOES:array[1..7] of string=(
    'S', 'Z', 'R', 'M', 'N', 'AO', 'L');

var
  i: integer; // declaraçao de valor inteiro
Begin

  // A string N será repassada no momento da solicitação da função...
  if trim(N) = '' then // se a string for igual a vazio para o processo !!!
    exit;

  // todas as letras maiúsculas
  N := ' '+AnsiUpperCase(N)+' ';
  for i := 1 to length(N) do
  begin
    // retira todos os acentos da vogal “A”
    if N[i] in ['Á', 'Ã', 'À', 'Â', 'Ä'] then N[i] := 'A';
    // retira todos os acentos da vogal “E”
    if N[i] in ['É', 'È', 'Ê', 'Ë'] then N[i] := 'E';
    // retira todos os acentos da vogal “I”
    if N[i] in ['Í', 'Ì', 'Î', 'Ï'] then N[i] := 'I';
    // retira todos os acentos da vogal “O”
    if N[i] in ['Ó', 'Õ', 'Ò', 'Ô', 'Ö'] then N[i] := 'O';
    // retira todos os acentos da vogal “U”
    if N[i] in ['Ú', 'Ù', 'Û', 'Ü'] then N[i] := 'U';
    // retira todos os acentos da consoante “N”
    if N[i] = 'Ñ' then N[i] := 'N';
    // TRANSFORMA cedilha EM C
    if N[i] = 'Ç' then N[i] := 'C';
    // retira caracteres que não pertença ao conjunto 'A'..'Z' e ' '
    if not(N[i] in ['A' .. 'Z', ' ']) then delete(N, i, 1);
  end;

  // RETIRA PREPOSIÇÕES
  for i := Low(PREPOSICOES) to High(PREPOSICOES) do
    N:=StringReplace(N,' '+PREPOSICOES[i]+' ',' ',[rfReplaceAll]);

  // RETIRA TITULOS
  for i := Low(TITULOS) to High(TITULOS) do
    N:=StringReplace(N,' '+TITULOS[i]+' ',' ',[rfReplaceAll]);

  // RETIRADA DE PALAVRAS QUE ASSOCIAM AO NOME ERRONEAMENTE…
  for i := Low(SOBRENOMES) to High(SOBRENOMES) do
    N:=StringReplace(N,' '+SOBRENOMES[i]+' ',' ',[rfReplaceAll]);

  // *** INICIA A FASE FINAL DA CODIFICAÇAO FONÉTICA...
  // *** INICIO DO SOUNDEX_BUSCA_BR_ADAPTADO_JJMALKA
  // *** COMO RETORNA ACIMA A STRING “S” TRATO DA MESMA FORMA DO INICIO
  // *** DA ANALISE...CONTO QUANTOS CARACTERES SOBRARAM E RODO O
  // *** SOUNDEX NO RESTANTE DA STRING...

  for i := Low(REGRA) to High(REGRA) do
    N:=StringReplace(N,REGRA[i,1],REGRA[i,2],[rfReplaceAll]);

  // **********  BLOCO FINAL DO SOUNDEX… ************

  // Eliminar as terminações S, Z, R, R, M, N, AO e L;
  for i := Low(TERMINACOES) to High(TERMINACOES) do
    N:=StringReplace(N,TERMINACOES[i]+' ',' ',[rfReplaceAll]);

  // INICIO DA RETIRADA DE LETRAS DUPLICADAS…
  for I := ord('A') to ord('Z') do
    N:=StringReplace(N,chr(i)+chr(i),chr(i),[rfReplaceAll]);
  // FINAL DE ANALISE DE CARACTERES DUPLICADOS…

  // Eliminar todas as vogais restantes e mais o H

  //N:=StringReplace(N,'A','',[rfReplaceAll]);
  //N:=StringReplace(N,'E','',[rfReplaceAll]);
  //N:=StringReplace(N,'I','',[rfReplaceAll]);
  //N:=StringReplace(N,'O','',[rfReplaceAll]);
  //N:=StringReplace(N,'U','',[rfReplaceAll]);

  // MAIS A CONSOANTE “H”
  N:=StringReplace(N,'H','',[rfReplaceAll]);

  // *** FINAL DA ANALISE FONÉTICA…
  Result := trim(N);

end;


falta alguma logica ai nesta interpretação das regras
no final ele pede para deletar todas as vogais e o H.
como assim?
explica e como
Código:
Manoel José da Silva Santos.

passa a ser
Código:
Manoe Jose Silva Santo

sem uso de vogais.

Uma outra falta é que em algum momento das regras ele pede para trocar N por M logo o nome Manoel passaria a ser Mamoe

de qualquer forma deixei de forma comentada a questão da vogais e deixei o codigo de facil alteração e ajuste futura caso nescessite.


Boa noite Strak2012

o que realmente estava precisando foi como o inicio da mensagem:

Alguém poderia me ajudar com uma função fonética /?
falta a parte que apague a ultima letra de um nome de acordo com as condições impostas

Exemplo:
Eliminar as terminações S, Z, R, R, M, N, AO e L;

nome para exemplo:
* Manoel José da Silva Santos.

Apos passar na funçao ficaria:

Manoe Jose Silva Santo


O que eu nao estava conseguindo era apagar a ultima letra de um nome, o exemplo era apenas para as terminações acima citadas.
O que voces talvez nao entenderam era justamente que a função estava praticamente pronta mas faltava isto. Postei ela por inteiro para ajudar outras pessoas que necessitem.

Caso fosse passa toda a função no nome do exemplo eu teria uma codificação totalmente diferente.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
jjmalka
Aprendiz
Aprendiz


Registrado: Domingo, 16 de Julho de 2006
Mensagens: 157

MensagemEnviada: Qui Nov 05, 2015 9:39 pm    Assunto: Responder com Citação

conorte escreveu:
Olá!
Eu também fiquei com dúvida sobre tirar o "L" de Manoel e "S" de Santos. E também fiquei com dúvida em outras substituições que "desfigurariam" a palavra deixando-a "irreconhecível".


Boa noite conorte.

O que acontece no meu caso para utilizar esta funçao é a forma com que pode ser utilizada a escrita de um determinado nome.
A fonética é um ponto complicado para determinados registros, como no meu: nome de pessoas.

O nome Heitor por exemplo, pode ser escrito:
Heitor
Eitor
Eytor
Eyto
...

tudo isto de acordo com o nivel do usuario que ficará responsavel pela inclusao dos dados.
E no finalmente como iria localizar esta pessoa?...
Dai a necessidade de uma codificação de acordo com a fonética.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Sex Nov 06, 2015 12:41 am    Assunto: Responder com Citação

tente fazer uso da rotina:


Código:
function ElimineTerminacoes(N: string; TERMINACOES: array of string): string;
procedure troque(var c1: char; c2: char; s: string);
var
  r: char;
begin
  r := c1;
  if AnsiUpperCase(r) = c1 then
  begin
    if pos(c1, AnsiUpperCase(s)) <> 0 then
      c1 := AnsiUpperCase(c2)[1];
  end
  else
  begin
    if pos(c1, AnsiLowerCase(s)) <> 0 then
      c1 := AnsiLowerCase(c2)[1];
  end;
end;
var
  i: integer;
begin
  N := ' ' + N + ' ';
  for i := 1 to length(N) do
  begin
    troque(N[i], 'A', 'ÁÃÀÂÄ');
    troque(N[i], 'E', 'ÉÈÊË');
    troque(N[i], 'I', 'ÍÌÎÏ');
    troque(N[i], 'O', 'ÓÕÒÔÖ');
    troque(N[i], 'U', 'ÚÙÛÜ');
    if N[i] = 'Ñ' then
      N[i] := 'N';
    if N[i] = 'Ç' then
      N[i] := 'c';
    if not(AnsiUpperCase(N[i])[1] in ['A' .. 'Z', ' ']) then
      delete(N, i, 1);
  end;
  for i := Low(TERMINACOES) to High(TERMINACOES) do
    N := StringReplace(N, AnsiUpperCase(TERMINACOES[i]) + ' ', ' ',
      [rfIgnoreCase, rfReplaceAll]);
  result := trim(N);
end;


da forma de uso
Código:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := ElimineTerminacoes('Manoel José da Silva Santos',
    ['S', 'Z', 'R', 'M', 'N', 'AO', 'L']);
end;

_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
jjmalka
Aprendiz
Aprendiz


Registrado: Domingo, 16 de Julho de 2006
Mensagens: 157

MensagemEnviada: Dom Nov 08, 2015 10:56 pm    Assunto: Responder com Citação

strak2012 escreveu:
tente fazer uso da rotina:


Código:
function ElimineTerminacoes(N: string; TERMINACOES: array of string): string;
procedure troque(var c1: char; c2: char; s: string);
var
  r: char;
begin
  r := c1;
  if AnsiUpperCase(r) = c1 then
  begin
    if pos(c1, AnsiUpperCase(s)) <> 0 then
      c1 := AnsiUpperCase(c2)[1];
  end
  else
  begin
    if pos(c1, AnsiLowerCase(s)) <> 0 then
      c1 := AnsiLowerCase(c2)[1];
  end;
end;
var
  i: integer;
begin
  N := ' ' + N + ' ';
  for i := 1 to length(N) do
  begin
    troque(N[i], 'A', 'ÁÃÀÂÄ');
    troque(N[i], 'E', 'ÉÈÊË');
    troque(N[i], 'I', 'ÍÌÎÏ');
    troque(N[i], 'O', 'ÓÕÒÔÖ');
    troque(N[i], 'U', 'ÚÙÛÜ');
    if N[i] = 'Ñ' then
      N[i] := 'N';
    if N[i] = 'Ç' then
      N[i] := 'c';
    if not(AnsiUpperCase(N[i])[1] in ['A' .. 'Z', ' ']) then
      delete(N, i, 1);
  end;
  for i := Low(TERMINACOES) to High(TERMINACOES) do
    N := StringReplace(N, AnsiUpperCase(TERMINACOES[i]) + ' ', ' ',
      [rfIgnoreCase, rfReplaceAll]);
  result := trim(N);
end;


da forma de uso
Código:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := ElimineTerminacoes('Manoel José da Silva Santos',
    ['S', 'Z', 'R', 'M', 'N', 'AO', 'L']);
end;


Valeu strak2012.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB