[ SQL ] Deletando Registros Duplicados

- Sunday, July 25, 2010

"Nem sempre temos tudo que queremos"

Cresci ouvindo essa essa frase e hoje ela se mostra ser verdadeira. Nunca fui de me preocupar muito com a consistência do banco de dado pois sempre tinha alguem para fazer isso por mim, acontece que no meu atual emprego, eu acabo fazendo isso mais do que no antigo e mais do que eu imaginei. Não quero que achem que estou reclamando, estou aprendendo um pouco mais de SQL, e isso era realmente preciso. Mas para justificar a frase eu vou dar um exemplo que me aconteceu essa semana.

Recebi uma base de pessoas com aproximadamente 300.000 registros, precisavamos trabalhar esses dados para utilizar em nossa aplicação. Acontece que aproximadamente 10% dos registros estavem em duplicidade e eu fiquei encarregado de limpar e trabalhar a base. Essa é a jstificativa para a frase, seria tudo tão perfeito se a base fosse consistente, os dados ja estivessem no formato que fossemos usar e tudo mais, MAS "Nem sempre temos tudo que queremos".

Bom vamos a solução. Eu implementei uma rotina para limpar a base usando cursor, demorava alguns minutos para deletar todos os registros duplicados. Então conversando com o Marcus, meu colega de trabalho, ele me mostrou uma solução muito mais eficiente. Resolvi implementar a solução do meu colega e o resultado foi o seguinte, eu deletava tudo em 2 segundos e sem usar cursor.

A SOLUÇÂO:
1)    Identificar o campo que seria usado para diferenciar os registros, no meu caso o CPF.
2)    Criar uma coluna de identificação para cada registro, usei um int com identity.
3)    Deletar os Registros em duplicidade de acordo com o ID.

Abaixo segue o script que usei.

-------
/* Insere coluna para servir como identificador */
alter table TabelaTeste
add id int identity

/* deleta os registros duplicados */
delete t from tabelaTeste t where t.id not in (select min(id) from tabelaTeste t_dup where t_dup.cpf = t.cpf )
-------

Estou liberando para download o script completo que:
1) Cria uma tabela com registros duplicados
1 - Base completa com duplicidade

2) Insere uma coluna para identificação dos registros
2 - Base completa com duplicidade e com chave de identificação

3) deleta todos os registros em duplicidade, deixando apenas um registro para cada CPF.
3 - Base limpa sem duplicidade

4) remove a coluna para identificação do registro
4 - Base limpa sem duplicidade e sem coluna adicional

 


[Download do Script]


Espero ter ajudado.



Blogado por Rafa Almeida as 10:48 PM

[ Regex ] Remover tags HTML da string

- Friday, July 16, 2010

Mais uma vez quero demonstrar como um regex, utilizado corretamente, pode ser poderoso. Imagine uma string qualquer onde você tenha tags HTML dentro:

"<p>Hi, <br/> “text .</strong>“</p> bad html </ul>will be removed too."

Agora imagine que você tenha que remover todas as tags HTML dessa string.
Fiz essa pergunta para alguns programadores iniciantes, e todos me responderam:

"-Faz um replace em nas tags HTML e remove todas elas".

Realmente é uma saida, mas não é a mais inteligente, funciona até que alguem coloque uma tag que você não tenha previsto. Uma maneira mais eficiente de fazer isso, é usando um Regex. vamus ao exemplo:

static void Main(string[] args)

{

    // Some String

    const string text = "<p>Hi, <br/> “Walking on water and developing software from a specification are easy if both are <strong>frozen.</strong>“ - Edward V. Berard</p> here some bad html </ul>will be removed too.";

 

    // Write the string with the html tags

    Console.WriteLine(text);

 

    // Write the string without the html tags

    Console.WriteLine(RemoveHtmlTags(text));

 

    Console.ReadLine();

}

 

private static string RemoveHtmlTags(string htmlString)

{

    // Regex to find all the html tags

    const string pattern = @"<(.|\n)*?>";

 

    // Return the string without html tags

    return Regex.Replace(htmlString, pattern, string.Empty);

}

 

Achei que podia ajudar algumas pessoas, então resolvi postar.

Creditos para http://aliraza.wordpress.com/, foi la que achei a primeira versão.



Blogado por Rafa Almeida as 6:05 PM

[ .NET ] IronRuby Integration

- Thursday, July 08, 2010

Hoje vou falar um pouco sobre IronRuby. Não sou um expert, mas comecei a brincar com o IronRuby, ele é mais uma ferramenta pra guardar naquela caixa de ferramentas que se quando temos um problema.

Em alguns casos queremos precisamos de uma linguagem dinâmica para realizar tarefas complicadas de maneira muito mais facil. Imagine por exemplo que você quer permitir que o cliente execute alguns tipos de scripts, normalmente se usaria um vbscript, mas porque não utilizar uma linguagem dinâmica? Alguns, como eu, devem estar achando que integrar uma linguagem como o ruby ao .net deve ser muito complicado, se você é um desses é porque não conhece o IronRuby (ou IronPyton, teoricamente os dois são muito parecidos).

No exemplo que colocarei para download, mostro como integrar o IronRuby com C#, para isso crio uma Interface simples ICalc e implemento ela em duas classes do ruby. depois executo as duas "calculadoras" que implementei ("somadora" e "multiplicadora").

Segue o exemplo do codigo para a chamada de um arquivo Ruby:

var runtime = Ruby.CreateRuntime();

var engine = runtime.GetEngine("rb");



var paths = new List<string>();

paths.Add(@"E:\Workspace\RafaelAlmeida.net\Trunk\Exemplos\IronRuby\Calculators.Console\bin\Release");

engine.SetSearchPaths(paths);


// Cria calculadora que sabe multiplicar

engine.ExecuteFile("Pessoa.rb");

var rubyClass = engine.Runtime.Globals.GetVariable("Multiplicadora");

var calculator = (ICalc)engine.Operations.CreateInstance(rubyClass);

// Calcula

var result = calculator.calculate(A, B);


// Imprime resultado

System.Console.WriteLine(string.Format("A * B = {0}", result));


// Cria calculadora que sabe somar

rubyClass = engine.Runtime.Globals.GetVariable("Somadora");

calculator = (ICalc)engine.Operations.CreateInstance(rubyClass);

// Calcula

result = calculator.calculate(A, B);


// Imprime resultado

System.Console.WriteLine(string.Format("A + B = {0}", result));

 

Simples não é? Se você quiser ver o exemplo completo, faça o download [ Aqui ]



Blogado por Rafa Almeida as 11:06 PM
Rafael Almeida Rafael da Silva Almeida, 22 Desenvolvedor;
C#, VB.NET, Java, C, Phyton, Linq, MVC;
VSTS, SQL, TV Digital, Xletview;
eusou@rafaelalmeida.net
SKYPE: stupied4ever
MSN: r.almeidasilva@terra.com.br
Twitter

Ultimos Posts

Amigos