Jump to content
FabianoSouza

Replace em partes da string

Recommended Posts

Olá pessoal. Tenho uma base com uns 5.000 registros.

Quero fazer um código para aplicar acento em nomes que foram gravados sem sua respectiva acentuação.

 

Parte 1

Até consegui montar uma código para testes usando UPDATE e replace.

Mas da forma como criei, se peço para acentuar a string Jose, acaba acentuando também Josevaldo (pois ambos tem a string "jose")

Preciso de um código que pegue cada parte do nome  (primeiro nome, nome do meio e último nome) da pessoa e verifique se há o valor passível de aplicar a acentuação.

 

Exemplo:

Jose Amancio dos Santos - teria que aplicar acento no Jose e em Amancio.

Josevaldo Pires Silva - não deve aplicar acento em Josevaldo

 

 

Parte 2

Como isso será uma rotina, quero ter um "dicionário" de nomes gravados da forma correta (acentuados) para serem usados na rotina de que aplicaria a acentuação.

Queria ver sugestões de como montar esse "dicionário". Seria um array? Seria ler uma tabela?

 

 

Podem ajudar?

Valew!

 

Share this post


Link to post
Share on other sites

Vish cara, acho que não dar para aplicar uma regra nessa situação não eim! Sei lá, mas não consigo pensar em nada para suprir isso.

A única coisa que me vem em mente é pré determinar os nomes em um array então comparar índices, assim assumindo seus valores.

Veja isso em PHP:

<?php
$nomes = [
    'Jose' => 'José',
    'Joao' => 'João'
];

$nome = "Jose";

if (array_key_exists($nome, $nomes)) {
    echo $nomes[$nome];
} else {
    echo $nome;
}

 

Share this post


Link to post
Share on other sites

Olá @Omar~

Bom, a parte do "dicionário" dá pra ver depois...posso ir me virando rodando o código na mão e alterando o nomes (depois penso em automatizar).

 

Preciso mesmo é montar o replace que analise separadamente as partes da string (primeiro nome, nome do meio e último nome), essa seria a primeira prioridade.

 

1) Entendo que precisaria fazer um select usando LIKE para encontrar palavras como jose, natalia, katia e etc.

Nesse ponto passaria o valor por variável para o WHERE do select.

 

2) Depois, pegando 1 registro por vez, dos que forem retornados do select, contar os espaços existentes na string para saber quantas análises na string precisam ser feitas.

3) Depois, usando num loop (iterando na mesma quantidade de espaços identificados no passo2),  colocar cada pedaço da string numa variável e fazer comparação (um IF usando valor do passo 1)  pra saber se precisa ser acentuada.

4) Aplicar o replace no registro

 

Acho que esse seria um caminho...mas não sei como montar essa separação da string e depois criar o loop. Seria nisso que mais preciso de ajuda.

 

 

Share this post


Link to post
Share on other sites

Buenas tchê.

 

Viajei legal agora nessa tua demanda, mas não seria simples validar os nomes com os espaços?

Isso, no caso do José, resolveria o problema do Josevaldo.

Tu tem como passar o script de replace q tu testou? Estou tentando montar algo aqui (em Oracle), mas agilizaria se já tivesse o q tu fez aí.

Share this post


Link to post
Share on other sites

Olá @Marlon Pacheco!
Segue o SQL "embrionário"

 

DECLARE @varNome varchar(120),
DECLARE @varNomeCorreto varchar(120)
SET @varNome = 'Jose'
SET @varNomeCorreto = 'José'

UPDATE minhaTabela 
SET 
    nome = REPLACE(nome,
        @varNome,
        @varNomeCorreto)
WHERE
    nome LIKE '%'+@varNome+'%' ;

Isso funciona. Mas com os problemas que citei no post.

Preciso criar uma inteligência nisso para atingir o objetivo que descrevi acima.

 

 

 

Share this post


Link to post
Share on other sites

bom dia

 

meio gambiarra mas acho que é um caminho

 

José no meio do nome 

 

nome = replace (nome, "jose ", "josé ") 

 

o espaço ele indica que o nome "acabou" e realmente é só josé

 

Jose como último sobrenome (Josevaldo Jose)

 

select nome = left(nome, len(nome) - 4) where right(nome,4) = 'jose'

 

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By FabianoSouza
      Tenho um campo de descrição no meu sistema... nesse campo preciso fazer um replace de alguns "substrings" que podem existir.
      Exemplos:
      <apelido>apelido</apelido>
      <saudacao>saudacao</saudacao>
       
      Usando CASE e REPLACE para tratar essas substrings aí de cima, funciona para um caso ou para o outro, não ambos.
      Vejam como estou aplicando o SQL.
      ... , CASE WHEN MWA.descMsg LIKE '%'+'<saudacao>saudacao</saudacao>'+'%' Then REPLACE(MWA.descMsg, '<saudacao>saudacao</saudacao>', dbo.saudacao(GETDATE())) WHEN MWA.descMsg LIKE '%'+'<apelido>apelido</apelido>'+'%' Then REPLACE(MWA.descMsg, '<apelido>apelido</apelido>', '[Apelido]') ELSE MWA.descMsg END AS msg ... Preciso fazer com que esse tratamento seja aplicado para todas as situações, não apenas para uma das duas situações.
      O lance é que não tenho como colocar o campo tratado numa variável e ir aplicando o tratamento a ela de forma isolada.
    • By usuario181474618518
      Bom dia a todos! 
       
      Estou iniciando em PHP, então talvez isso seja uma pergunta burra. Estou utilizando uma plataforma que fornece um array de categorias como digitado abaixo, e minha ideia é fazer uma busca no conteúdo por essas categorias, e substituir elas por outro array, que no caso terá as mesmas categorias, no entanto, com links. Veja:
      $conteudo = "Meu conteúdo Filmes Laranja e Verde. Blackout."; $from = array( 0 => "Laranja", 1 => "Azul", 2 => "Vermelho", 3 => "Verde", 4 => "Black" ); $to = array( 0 => "<a href='#laranja'>Laranja</a>", 1 => "<a href='#azul'>Azul</a>", 2 => "<a href='#vermelho'>Vermelho</a>", 3 => "<a href='#verde'>Verde</a>", 4 => "<a href='#ver'>Black</a>" ); $novoconteudo = strtr($conteudo, array_combine($from, $to)); echo $novoconteudo;  
      O máximo que conseguir fazer foi usando strtr, no entanto acaba fazendo algumas substituições "burras", como por exemplo adicionar link em "Black" quando na verdade a palavra é "Blackout". Acredito que para resolver isso, deveria ser feito com preg_replace, porém já tentei e não consegui. Alguém pode me ajudar?
       
      Veja: http://sandbox.onlinephpfunctions.com/code/e7cfd27ea182041de0519df3ed22bedc93cda18b
    • By FabianoSouza
      Pessoal, to apanhando para criar uma function para remover a última vírgula que aparece na string chamada beneficios.
      Estava tentando isso:
      ... REVERSE(STUFF(REVERSE( ---------------------------------- CASE WHEN valeTransporte = '1' Then 'Vale-transporte,' ELSE '' END + CASE WHEN valeRefeicao = '1' Then 'Vale-refeição,' ELSE '' END + CASE WHEN seguroDeVida = '1' Then 'Seguro de vida,' ELSE '' END ---------------------------------- ), 1, 1, '')) AS 'beneficios' ... O problema é que nem sempre haverá string para ser tratada, aí o campo aparece como NULL e gera problema na hora de gerar um JSON pela aplicação.
      Preciso de uma function que previna a situação de não haver string, e retorne valor vazio (não NULL).
       
      Valew!
       
    • By Rui PG
      Boa tarde, Pessoal"
       
      Sou iniciante em SQL, em uma tabela do nosso BD tempos um campo que possui o registro com as informações do paciente concatenado com uma serie de valores que não precisamos.
      Como eu faço, para montar uma select para extrair desse registro apenas o que está entre aspas?
       
      O meu registro está assim:
      a:28:{i:18;s:13:"Sérgio silva";i:19;s:11:"1199900001";i:20;s:0:"n/i";i:21;s:0:"n/i";i:23;s:15:"Amil One Health";i:24;s:0:"n/i";i:27;s:0:"n/i";i:31;s:1:"2";i:32;s:0:"n/i";i:33;s:1:"2";i:34;s:0:;}
       
      Eu preciso dele assim:
      "Sérgio silva";"1199900001";"n/i";"n/i";"Amil One Health";"n/i";"n/i";"2";"n/i";"2";
       
      Observação, esses monte de valores a:28: ...etc... eles mudam, não são valores fixos, se fossem até usaria o replace, mas são vários valores.
       
      Depois que eu chegar nessa mineração: "Sérgio silva";"1199900001";"n/i";"n/i";"Amil One Health";"n/i";"n/i";"2";"n/i";"2";
      Como eu faço para alocar cada valor em campo campo qualquer, pode ser uma tabela temporária, tipo assim:
       
      |nome           |campo 1        |Campo 2 |Campo 3 |Campo 4               |Campo  5 | .....
      |Sérgio silva|1199900001|n/i              |n/i              |Amil One Health|n/i               |n/i|2|n/i|2| .....
       
      Muito obrigado amigos
       
       
       
       
       
       
    • By ricardosac
      Boa tarde!
       
      Alguém possa me ajudar a resolver o problema de como remover acentuação e espaços.
       
      Ao selecionar estado Alagoas e cidade Barra de São Miguel, retorna assim Barra de São Miguel.html e que deveria ser substituído por barradesaomiguel.html.
      Segue abaixo:
       
      <div id="wrap">
                <form name="myForm" action method="post">
                <select class="selcls" name="estados" onchange="updateModels(this.form)">
                  <option>Selecione estado</option>
                  <option>Acre</option>
                  <option>Alagoas</option>

                  </select> <select class="selcls" name="cidades"></select>
                  <input id="B1" type="button" value="Ok" class="btn btn-primary">
                </form>
              </div>

              <script type="text/javascript">
              var cidades = [];
             cidades.Acre = ['Rio Branco','Acrelândia','Assis Brasil','Brasiléia','Bujari','Capixaba','Cruzeiro do Sul','Epitaciolândia','Feijó','Jordão','Mâncio Lima','Manoel Urbano','Marechal Thaumaturgo','Plácido de Castro','Porto Acre','Porto Walter','Rodrigues Alves',  'Santa Rosa do Purus','Sena Madureira','Senador Guiomard','Tarauacá','Xapuri'];
             cidades.Alagoas = ['Maceió','Água Branca','Anadia','Arapiraca','Atalaia','Barra de Santo Antônio','Barra de São Miguel','Batalha','Belém','Belo Monte','Boca da Mata','Branquinha','Cacimbinhas','Cajueiro','Campestre','Campo Alegre','Campo Grande','Canapi','Capela','Carneiros','Chã Preta','Coité do Nóia','Colônia Leopoldina','Coqueiro Seco','Coruripe','Craíbas',  'Delmiro Gouveia','Dois Riachos','Estrela de Alagoas','Feira Grande','Feliz Deserto','Flexeiras','Girau do Ponciano','Ibateguara','Igaci','Igreja Nova','Inhapi','Jacaré dos Homens','Jacuípe','Japaratinga','Jaramataia','Jequiá da Praia','Joaquim Gomes','Jundiá','Junqueiro','Lagoa da Canoa','Limoeiro de Anadia','Major Isidoro','Mar Vermelho','Maragogi','Maravilha','Marechal Deodoro','Maribondo','Mata Grande','Matriz de Camaragibe','Messias','Minador do Negrão','Monteirópolis','Murici','Novo Lino','Olho d\'Água das Flores','Olho d\'Água do Casado','Olho d\'Água Grande','Olivença','Ouro Branco','Palestina','Palmeira dos Índios','Pão de Açúcar','Pariconha','Paripueira','Passo de Camaragibe','Paulo Jacinto', 'Penedo','Piaçabuçu','Pilar','Pindoba','Piranhas','Poço das Trincheiras','Porto Calvo','Porto de Pedras','Porto Real do Colégio','Quebrangulo','Rio Largo','Roteiro','Santa Luzia do Norte','Santana do Ipanema','Santana do Mundaú','São Brás','São José da Laje','São José da Tapera','São Luís do Quitunde','São Miguel dos Campos','São Miguel dos Milagres','São Sebastião','Satuba','Senador Rui Palmeira','Tanque d\'Arca','Taquarana','Teotônio Vilela','Traipu','União dos Palmares','Viçosa'];
              // ---
              function updateModels(theForm) 
               { if(theForm.estados.selectedIndex<1){return false; }
                 var op=theForm.estados.options;
                 var newModels = cidades[op[op.selectedIndex].value];
                 theForm.cidades.options.length = 0;
                 theForm.cidades.options[0] = new Option("Selecione cidade", "");
                 theForm.cidades.options[0].selected = true;
                 for (var i=0; i<newModels.length; i++) 
                 { theForm.cidades.options[i+1] = new Option(newModels, newModels); }  
               }
              // ---
              // check both selections have been made
               document.getElementById("B1").onclick=function(event)
                { event=event || window.event;
                  var targElem = event.target || event.srcElement;
                  var thisForm=targElem.parentNode;
                  if(thisForm.estados.selectedIndex>0 && thisForm.cidades.selectedIndex>0)
                    { var cidadesP= thisForm.cidades;
                            location.href= cidadesP[cidadesP.selectedIndex].value+".html"; }
                      else { return false; } 
                }

              </script>
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.