abreviar nomes

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

kakamachado
Usuário Nível 1
Usuário Nível 1
Mensagens: 30
Registrado em: 07 Mar 2016 18:54
Localização: Rio de Janeiro

abreviar nomes

Mensagem por kakamachado »

Bom dia colegas, alguém tem um rotina ou função que abrevie nomes próprios (pessoas), por exemplo, de 60 para 30 caracteres? Deve manter o primeiro e o último nome sem abreviar.
Obrigado
wmanesco
Usuário Nível 3
Usuário Nível 3
Mensagens: 116
Registrado em: 09 Set 2016 13:18
Localização: ITAJAI - SC

abreviar nomes

Mensagem por wmanesco »

Boa noite

Seria isso?

Código: Selecionar todos


FUNCTION AbreviarNome( cNomeCompleto )
   LOCAL cAbreviacao
   LOCAL aNome, cNome

   aNome := HB_ATokens( Alltrim( cNomeCompleto ), " " )

   cAbreviacao := ""
   FOR EACH cNome IN aNome
      IF Empty( cNome )
         LOOP
      ENDIF

      IF HB_EnumIndex( cNome ) == 1 .OR. HB_EnumIndex( cNome ) == Len( aNome ) .OR. Len( cNome ) <= 3
         cAbreviacao += " " + cNome
      ELSE
         cAbreviacao += " " + Left( cNome, 1 ) + "."
      ENDIF
   NEXT

RETURN cAbreviacao
William Manesco
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

abreviar nomes

Mensagem por alxsts »

Olá!

Aparentemente o código postado atenderá a solicitação.

Há muito tempo precisei desenvolver uma rotina destas mas não tenho o fonte, pois ficou no cliente. A única observação que faço é a seguinte: quando o último sobrenome for "Junior","Jr","Jr.","Filho","Neto","Sobrinho","Sobr.","Netto", etc, o penúltimo sobrenome não poderá ser abreviado.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

abreviar nomes

Mensagem por fladimir »

Ótima Observação Alexandre... vlw
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
wmanesco
Usuário Nível 3
Usuário Nível 3
Mensagens: 116
Registrado em: 09 Set 2016 13:18
Localização: ITAJAI - SC

abreviar nomes

Mensagem por wmanesco »

Realmente não tinha pensado nesta hipótese, obrigado
William Manesco
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
kakamachado
Usuário Nível 1
Usuário Nível 1
Mensagens: 30
Registrado em: 07 Mar 2016 18:54
Localização: Rio de Janeiro

abreviar nomes

Mensagem por kakamachado »

Boa tarde Wmanesco, Fladimir e Alxsts, obrigado pelas colaborações. Fiz uma alteração na função, pois me expressei mal na demanda. Precisava que os nomes fossem abreviados somente se o nome completo ultrapassasse 30 caracteres e mantendo o primeiro e o último sem abreviar. Ex: JOAO CARLOS DA SILVA PEREIRA CONSTANTINO (40 CARACTERES) ficaria JOAO CARLOS DA S P CONSTANTINO (30 CARACTERES) não precisando abreviar o CARLOS. Valeu galera.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

abreviar nomes

Mensagem por alxsts »

Olá!

A verdade é que 30 caracteres para armazenar nomes de pessoas é pouco espaço. Mesmo abreviando, é possível que ultrapasse este limite. O que fazer? Truncar? Creio que não seja a melhor solução...
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

abreviar nomes

Mensagem por JoséQuintas »

Achei interessante o desafio.

Código: Selecionar todos

PROCEDURE Main

   LOCAL nCont, cNome := "JOSE MARIA CUNHA HARBOUR PROGRAMMER OF QUINTAS"

   FOR nCont = 10 TO 70 STEP 5
      ? AbreviarNome( cNome, nCont )
   NEXT

   RETURN

FUNCTION AbreviarNome( cNaoAbreviado, nTamanho )

   LOCAL aNomeLst, cAbreviado := "", oElement, nCont, nQtNaoAbreviado, nTentativas := 0, lTiraInutil := .T., nLimit

   hb_Default( @nTamanho, Len( cNaoAbreviado ) )

   aNomeLst := hb_RegExSplit( " ", cNaoAbreviado )

   IF Len( aNomeLst ) > 2
      DO WHILE .T.
         cAbreviado := ""
         nQtNaoAbreviado := 0
         FOR EACH oElement IN aNomeLst
            cAbreviado += oElement + " "
            nQtNaoAbreviado += iif( Len( oElement ) < 4, 0, 1 )
         NEXT
         DO CASE
         CASE Len( cAbreviado ) <= nTamanho
         CASE nQtNaoAbreviado < 3
         CASE lTiraInutil
            FOR EACH oElement IN aNomeLst
               IF oElement == "OF" .OR. oElement == "DE" .OR. oElement == "DO" .OR. oElement == "DA" .OR. oElement == "DAS" .OR. oElement == "DOS"
                  aDel( aNomeLst, oElement:__EnumIndex )
                  aSize( aNomeLst, Len( aNomeLst ) - 1 )
               ENDIF
            NEXT
            lTiraInutil := .F.
            LOOP
         CASE nTentativas > 20
         OTHERWISE
            nLimit := Len( aNomeLst ) - iif( aNomeLst[ Len( aNomeLst ) ] $ "JUNIOR,JR,FILHO,NETO", 2, 1 )
            IF nLimit > 2
               FOR nCont = nLimit TO 2 STEP -1
                  IF Len( aNomeLst[ nCont ] ) > 2
                     aNomeLst[ nCont ] := Left( aNomeLst[ nCont ], 1 ) + "."
                     EXIT
                  ENDIF
               NEXT
            ENDIF
            nTentativas += 1
            LOOP
         ENDCASE
         EXIT
      ENDDO
   ENDIF
   cAbreviado := Pad( cAbreviado, nTamanho )

   RETURN cAbreviado

Código: Selecionar todos

JOSE M. C.
JOSE M. C. H. P
JOSE M. C. H. P. QUI
JOSE M. C. H. P. QUINTAS
JOSE MARIA C. H. P. QUINTAS
JOSE MARIA CUNHA H. P. QUINTAS
JOSE MARIA CUNHA HARBOUR P. QUINTAS
JOSE MARIA CUNHA HARBOUR PROGRAMMER QUINTAS
JOSE MARIA CUNHA HARBOUR PROGRAMMER OF QUINTAS
JOSE MARIA CUNHA HARBOUR PROGRAMMER OF QUINTAS
JOSE MARIA CUNHA HARBOUR PROGRAMMER OF QUINTAS
JOSE MARIA CUNHA HARBOUR PROGRAMMER OF QUINTAS
JOSE MARIA CUNHA HARBOUR PROGRAMMER OF QUINTAS
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

abreviar nomes

Mensagem por JoséQuintas »

Compliquei um pouco mais: abrevia do centro pras bordas.
Peguei só um pedaço do nome de D.Pedro pra testar

Código: Selecionar todos

PROCEDURE Main

   LOCAL nCont, cNome := "PEDRO DE ALCANTARA FRANCISCO ANTONIO JOAO CARLOS XAVIER DE PAULA MIGUEL RAFAEL JOAQUIM"

   FOR nCont = 100 TO 10 STEP -5
      ? AbreviarNome( cNome, nCont )
   NEXT

   RETURN

FUNCTION AbreviarNome( cNaoAbreviado, nTamanho )

   LOCAL aNomeLst, cAbreviado := "", oElement, nCont, nQtNaoAbreviado, nTentativas := 0, lTiraInutil := .T., anNao, nMeio

   hb_Default( @nTamanho, Len( cNaoAbreviado ) )

   aNomeLst := hb_RegExSplit( " ", cNaoAbreviado )

   IF Len( aNomeLst ) > 2
      DO WHILE .T.
         cAbreviado := ""
         nQtNaoAbreviado := 0
         FOR EACH oElement IN aNomeLst
            cAbreviado += oElement + " "
            nQtNaoAbreviado += iif( Len( oElement ) < 4, 0, 1 )
         NEXT
         DO CASE
         CASE Len( cAbreviado ) <= nTamanho
         CASE nQtNaoAbreviado < 3
         CASE lTiraInutil
            FOR EACH oElement IN aNomeLst
               IF oElement == "E" .OR. oElement == "DE" .OR. oElement == "DO" .OR. oElement == "DA" .OR. oElement == "DAS" .OR. oElement == "DOS"
                  aDel( aNomeLst, oElement:__EnumIndex )
                  aSize( aNomeLst, Len( aNomeLst ) - 1 )
               ENDIF
            NEXT
            lTiraInutil := .F.
            LOOP
         CASE nTentativas > 50
         OTHERWISE
            anNao := { 1, Len( aNomeLst ), iif( aNomeLst[ Len( aNomeLst ) ] $ "JUNIOR,JR,FILHO,NETO,SOBRINHO", Len( aNomeLst ) - 1, 1 ) }
            nMeio := Round( Len( aNomeLst ) / 2, 0 )
            IF Len( aNomeLst[ nMeio ] ) > 3 .AND. AScan( anNao, nMeio ) == 0
               aNomeLst[ nMeio ] := Left( aNomeLst[ nMeio ], 1 ) + "."
               LOOP
            ENDIF
            FOR nCont = 1 TO nMeio
               DO CASE
               CASE nMeio + nCont < Len( aNomeLst ) .AND. Len( aNomeLst[ nMeio + nCont ] ) > 3 .AND. AScan( anNao, nMeio + nCont ) == 0
                  aNomeLst[ nMeio + nCont ] := Left( aNomeLst[ nMeio + nCont ], 1 ) + "."
                  EXIT
               CASE nMeio - nCont > 1 .AND. Len( aNomeLst[ nMeio - nCont ] ) > 3 .AND. AScan( anNao, nMeio - nCont ) == 0
                  aNomeLst[ nMeio - nCont ] := Left( aNomeLst[ nMeio - nCont ], 1 ) + "."
                  EXIT
               ENDCASE
            NEXT
            nTentativas += 1
            LOOP
         ENDCASE
         EXIT
      ENDDO
   ENDIF
   cAbreviado := Pad( cAbreviado, nTamanho )

   RETURN cAbreviado

Código: Selecionar todos


PEDRO DE ALCANTARA FRANCISCO ANTONIO JOAO CARLOS XAVIER DE PAULA MIGUEL RAFAEL JOAQUIM

PEDRO DE ALCANTARA FRANCISCO ANTONIO JOAO CARLOS XAVIER DE PAULA MIGUEL RAFAEL JOAQUIM
PEDRO DE ALCANTARA FRANCISCO ANTONIO JOAO CARLOS XAVIER DE PAULA MIGUEL RAFAEL JOAQUIM
PEDRO ALCANTARA FRANCISCO ANTONIO JOAO CARLOS XAVIER PAULA MIGUEL RAFAEL JOAQUIM
PEDRO ALCANTARA FRANCISCO ANTONIO JOAO C. XAVIER PAULA MIGUEL RAFAEL JOAQUIM
PEDRO ALCANTARA FRANCISCO ANTONIO JOAO C. X. PAULA MIGUEL RAFAEL JOAQUIM
PEDRO ALCANTARA FRANCISCO ANTONIO J. C. X. P. MIGUEL RAFAEL JOAQUIM
PEDRO ALCANTARA FRANCISCO A. J. C. X. P. MIGUEL RAFAEL JOAQUIM
PEDRO ALCANTARA FRANCISCO A. J. C. X. P. M. RAFAEL JOAQUIM
PEDRO ALCANTARA F. A. J. C. X. P. M. RAFAEL JOAQUIM
PEDRO ALCANTARA F. A. J. C. X. P. M. R. JOAQUIM
PEDRO A. F. A. J. C. X. P. M. R. JOAQUIM
PEDRO A. F. A. J. C. X. P. M. R. JOAQUIM
PEDRO A. F. A. J. C. X. P. M. R. JO
PEDRO A. F. A. J. C. X. P. M.
PEDRO A. F. A. J. C. X. P
PEDRO A. F. A. J. C.
PEDRO A. F. A.
PEDRO A. F
Nota: a cada nome abreviado, testa pra ver se já resolveu, pra não abreviar demais
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

abreviar nomes

Mensagem por JoséQuintas »

E se o final for FILHO, permanece primeiro e dois últimos, enquanto der.... rs

Código: Selecionar todos


PEDRO DE ALCANTARA FRANCISCO ANTONIO JOAO CARLOS XAVIER DE PAULA MIGUEL RAFAEL JOAQUIM FILHO

PEDRO DE ALCANTARA FRANCISCO ANTONIO JOAO CARLOS XAVIER DE PAULA MIGUEL RAFAEL JOAQUIM FILHO
PEDRO ALCANTARA FRANCISCO ANTONIO JOAO CARLOS XAVIER PAULA MIGUEL RAFAEL JOAQUIM FILHO
PEDRO ALCANTARA FRANCISCO ANTONIO JOAO C. XAVIER PAULA MIGUEL RAFAEL JOAQUIM FILHO
PEDRO ALCANTARA FRANCISCO ANTONIO JOAO C. X. PAULA MIGUEL RAFAEL JOAQUIM FILHO
PEDRO ALCANTARA FRANCISCO ANTONIO J. C. X. P. MIGUEL RAFAEL JOAQUIM FILHO
PEDRO ALCANTARA FRANCISCO A. J. C. X. P. MIGUEL RAFAEL JOAQUIM FILHO
PEDRO ALCANTARA FRANCISCO A. J. C. X. P. M. RAFAEL JOAQUIM FILHO
PEDRO ALCANTARA F. A. J. C. X. P. M. RAFAEL JOAQUIM FILHO
PEDRO ALCANTARA F. A. J. C. X. P. M. R. JOAQUIM FILHO
PEDRO A. F. A. J. C. X. P. M. R. JOAQUIM FILHO
PEDRO A. F. A. J. C. X. P. M. R. JOAQUIM FILH
PEDRO A. F. A. J. C. X. P. M. R. JOAQUIM
PEDRO A. F. A. J. C. X. P. M. R. JO
PEDRO A. F. A. J. C. X. P. M.
PEDRO A. F. A. J. C. X. P
PEDRO A. F. A. J. C.
PEDRO A. F. A.
PEDRO A. F
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder