Fonética (matéria ed. 82 Clube Delphi)

Delphi

27/04/2007

Galera,

Alguém já digitou a ´listagem 1´, que é o .pas da dll do Delphi? Se puder disponibilizar...!

Valeu :!:


Powerlog Tecnologia

Powerlog Tecnologia

Curtidas 0

Respostas

Renatacoimbra

Renatacoimbra

27/04/2007

Coloca em uma unit essa função e usa sem precisar de DLL


class function TUtil.PesqFonetica(Nome: PChar): PChar;
var
  i, p: integer;
  novo, aux: string;
begin
  try
    // Adicione SysUtils em uses
    aux := AnsiUpperCase(nome);
    novo := ´´;

    // Tira acentos
    for i := 1 to Length(aux) do
    begin
      case aux[i] of
        ´Á´, ´Â´, ´Ã´, ´À´, ´Ä´, ´Å´: aux[i] := ´A´;
        ´É´, ´Ê´, ´È´, ´Ë´: aux[i] := ´E´;
        ´Í´, ´Î´, ´Ì´, ´Ï´: aux[i] := ´I´;
        ´Ó´, ´Ô´, ´Õ´, ´Ò´, ´Ö´: aux[i] := ´O´;
        ´Ú´, ´Û´, ´Ù´, ´Ü´: aux[i] := ´U´;
        ´Ç´: aux[i] := ´C´;
        ´Ñ´: aux[i] := ´N´;
        ´Ý´, ´Ÿ´, ´Y´: aux[i] := ´I´;
      else
        if Ord(aux[i]) > 127 then
          aux[i] := 32;
      end;
    end;

    // Retira E , DA, DE e DO do nome
    // José da Silva = José Silva
    // João Costa e Silva = João Costa Silva
    p := Pos(´ DA ´, aux);
    while p > 0 do
    begin
      Delete(aux, p, 3);
      p := Pos(´ DA ´, aux);
    end;
    p := Pos(´ DAS ´, aux);
    while p > 0 do
    begin
      Delete(aux, p, 4);
      p := Pos(´ DAS ´, aux);
    end;
    p := Pos(´ DE ´, aux);
    while p > 0 do
    begin
      Delete(aux, p, 3);
      p := Pos(´ DE ´, aux);
    end;
    p := Pos(´ DI ´, aux);
    while p > 0 do
    begin
      Delete(aux, p, 3);
      p := Pos(´ DI ´, aux);
    end;
    p := Pos(´ DO ´, aux);
    while p > 0 do
    begin
      Delete(aux, p, 3);
      p := Pos(´ DO ´, aux);
    end;
    p := Pos(´ DOS ´, aux);
    while p > 0 do
    begin
      Delete(aux, p, 4);
      p := Pos(´ DOS ´, aux);
    end;
    p := Pos(´ E ´, aux);
    while p > 0 do
    begin
      Delete(aux, p, 2);
      p := Pos(´ E ´, aux);
    end;

    // Retira letras duplicadas
    // Elizabette = Elizabete
    for i := 1 to Length(aux)-1 do
      if aux[i] = aux[i+1] then
        Delete(aux, i, 1);

    for i := 1 to Length(aux) do
    begin
      case aux[i] of
        // ´A´,´E´,´I´,´O´,´U´,´Y´,´H´ e espaços: ignora

        ´B´,´D´,´F´,´J´,´K´,´L´,´M´,´N´,´R´,´T´,´V´,´X´:
          novo := novo + aux[i];

        ´C´:  // CH = X
          if aux[i+1] = ´H´ then
            novo := novo + ´X´
          else // Carol = Karol
          if aux[i+1] in [´A´,´O´,´U´] then
            novo := novo + ´K´
          else // Celina = Selina
          if aux[i+1] in [´E´,´I´] then
            novo := novo + ´S´;

        ´G´: // Jeferson = Geferson
          if aux[i+i] = ´E´ then
            novo := novo + ´J´
          else
            novo := novo + ´G´;

        ´P´: // Phelipe = Felipe
           if aux[i+1] = ´H´ then
             novo := novo + ´F´
           else
             novo := novo + ´P´;

        ´Q´: // Keila = Queila
           if aux[i+1] = ´U´ then
             novo := novo + ´K´
           else
             novo := novo + ´Q´;

        ´S´:
           case aux[i+1] of
             ´H´: // SH = X
               novo := novo + ´X´;

             ´A´,´E´,´I´,´O´,´U´:
               if aux[i-1] in [´A´,´E´,´I´,´O´,´U´] then
                 novo := novo + ´Z´ // S entre duas vogais = Z
               else
                 novo := novo + ´S´;
           end;

        ´W´: // Walter = Valter
           novo := novo + ´V´;

        ´Z´: // no final do nome tem som de S -> Luiz = Luis
           if (i = Length(aux)) or (aux[i+1] = ´ ´) then
             novo := novo + ´S´
           else
             novo := novo + ´Z´;
      end;
    end;
    //novo := novo + ´ ´;
    Result := PChar(novo);
  except
    Result := PChar(´´);
  end;
end;




GOSTEI 0
Powerlog Tecnologia

Powerlog Tecnologia

27/04/2007

Blz

Agora só vou implementar o ´TH´ para buscas como ´THIAGO -> TIAGO´ e ver se meu cliente precisa de alguma outra... Assim que der certo já posto aqui tb

Valeeeu!!! :!: :!: :!:


GOSTEI 0
Marco Salles

Marco Salles

27/04/2007

Mas o ´Tcham´ desse artigo e exatamente a DLL para criar uma UDF no Banco :lol: :lol: :lol:


GOSTEI 0
Adriano Santos

Adriano Santos

27/04/2007

[quote:b3c34c2b99=´Marco Salles´]Mas o ´Tcham´ desse artigo e exatamente a DLL para criar uma UDF no Banco :lol: :lol: :lol:[/quote:b3c34c2b99]
O ´tcham´...essa eu gostei. :lol: :lol: :lol:


GOSTEI 0
POSTAR