Category Archives: Linguagem

Contando palavras no SQL Server

Hoje precisei executar uma consulta no SQL Server que me retornasse a quantidade de palavras de uma coluna, agrupado pela palavra.

Utilizei a consulta abaixo para fazer o serviço sujo:


WITH Num1 (n) AS (SELECT 1 UNION ALL SELECT 1),
Num2 (n) AS (SELECT 1 FROM Num1 AS X, Num1 AS Y),
Num3 (n) AS (SELECT 1 FROM Num2 AS X, Num2 AS Y),
Num4 (n) AS (SELECT 1 FROM Num3 AS X, Num3 AS Y),
Nums (n) AS (SELECT ROW_NUMBER() OVER(ORDER BY n) FROM Num4),
Words (word) AS (
SELECT SUBSTRING(' ' + descr + ' ', n + 1, 
       CHARINDEX(' ', ' ' + descr + ' ', n + 1) - n - 1)
FROM Nums
JOIN (SELECT text FROM TweetMessages) AS F(descr)
  ON SUBSTRING(' ' + descr + ' ', n, 1 ) = ' '
 AND n < LEN(' ' + descr + ' '))
SELECT word, COUNT(*) AS cnt 
FROM Words
GROUP BY word
ORDER BY cnt DESC

Não é uma maravilha de performance, mas é bem útil!

O resultado da consulta:
twitterCount

Baixando o conteúdo de uma URL no PowerShell

Hoje precisei programar um job no SQL Server para baixar um arquivo de um site usando o powershell.

O script que eu utilizei foi esse:


$fileName = "c:tempfile.zip"
$webclient = New-Object System.Net.WebClient
$webclient.DownloadFile("http://siteparabaixararquivo/arquivo",$fileName)

Um script muito simples que as vezes poder ser útil.

Indexando e buscando documentos com Lucene.Net e LINQ

Código de exemplo:


using System;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.IO;
using Lucene.Net.Store;
using Lucene.Net.Linq;
using Lucene.Net.Linq.Mapping;
using Lucene.Net.Analysis.Standard;

namespace LuceneTests
{
    [TestClass]
    public class LuceneTest
    {
        [TestMethod]
        public void TestIndex()
        {
            // Configura o Lucene.
            var luceneDir = Path.Combine(System.Environment.CurrentDirectory, 
                "lucene_index");

            if (!System.IO.Directory.Exists(luceneDir))
            {
                lock (this)
                {
                    System.IO.Directory.CreateDirectory(luceneDir);
                }
            }

            var directory = FSDirectory.Open(new DirectoryInfo(luceneDir));
            var provider = new LuceneDataProvider(directory, 
                Lucene.Net.Util.Version.LUCENE_30);

            // Indexa os Documentos.
            using (var session = provider.OpenSession<Document>())
            {
                session.Add(new Document()
                {
                    Title = "Hello",
                    Content = "Hello Lucene!"
                });

                session.Add(new Document()
                {
                    Title = "Hi",
                    Content = "Hi, Lucene!"
                });
            }


            // Busca os documentos que contém a palavra "Hello" no título.
            var items = provider.AsQueryable<Document>()
                .Where(l => l.Title.Contains("Hello"));

            Assert.AreNotEqual(items.Count(), 0);
        }
    }
    class Document
    {
        [Field(Analyzer = typeof(StandardAnalyzer))]
        public String Title { get; set; }

        [Field(Analyzer = typeof(StandardAnalyzer))]
        public String Content { get; set; }
    }
}

Levantando um http server simples no OSX, de forma nativa

Estava precisando levantar um simples servidor http de páginas estáticas no osx. Após uma busca no google, descobri uma forma muito simples de fazer isso, utilizando pyhton, que ja vem embutido no osx.

Ã? só executar o seguinte comando do diretório a ser servido:
Hadron:HTML lpicanco$ python -m SimpleHTTPServer 8082

Um simples servidor HTTP será iniciado para o diretório local. 8082 é o número da porta.

Removendo a acentua�§�£o e os caracteres especiais de uma String

Estava precisando remover a acentuação e os caracteres especiais do nome de um arquivo. Para isso, desenvolvi um extension method para a classe String.

Exemplo:
String de entrada:
Adobe Acrobat – Pacy-Paraná_05.12_áÃ?¨Ã?¯Ã?´úã+.pdf

String de retorno:
AdobeAcrobatPacyParana_05.12_aeioua.pdf

Desenvolvi o método utilizando uma HashTable e expressão regular. Caso você tenha alguma sugestão de melhoria, poste aí nos comentários.

Extension method:

public static String RemoveSpecialCharacters(this String self)
{
	var normalizedString = self;

	// Prepara a tabela de símbolos.
	var symbolTable = new Dictionary();
	symbolTable.Add('a', new char[] {'Ã? ', 'á', 'Ã?¤', 'â', 'ã'});
	symbolTable.Add('c', new char[] { 'ç' });
	symbolTable.Add('e', new char[] { 'Ã?¨', 'é', 'Ã?«', 'ê' });
	symbolTable.Add('i', new char[] { 'Ã?¬', 'í', 'Ã?¯', 'Ã?®' });
	symbolTable.Add('o', new char[] { 'Ã?²', 'ó', 'Ã?¶', 'Ã?´', 'õ' });
	symbolTable.Add('u', new char[] { 'Ã?¹', 'ú', 'Ã?¼', 'Ã?»' });

	// Substitui os símbolos.
	foreach (var key in symbolTable.Keys)
	{
		foreach (var symbol in symbolTable[key])
		{
			normalizedString = normalizedString.Replace(symbol, key);
		}
	}
			
	// Remove os outros caracteres especiais.
	normalizedString = Regex.Replace(normalizedString, "[^0-9a-zA-Z._]+?", "");
	return normalizedString;
}