você está aqui: Home  → Arquivo de Mensagens

Usando o SQL para buscas em arquivos de texto

Colaboração: Cesar Brod

Data de Publicação: 17 de março de 2013

Antes de começar, você deve ter instalado, em sua máquina, a linguagem de programação Python e o servidor de base de dados SQLite3. No Debian e seus derivados isto é feito com o comando abaixo.

  sudo apt-get install python sqlite3

Agora, visite a página do SQLet e baixe o programa. Abaixo estão os comandos para baixar a versão 1.0:

  wget http://www.umlet.com/sql_on_linux_command_line/sqlet_1_0/sqlet.zip
  unzip sqlet.zip
  chmod +x sqlet.py

Crie um arquivo texto chamado "exemplo.csv" com o conteúdo similar ao que está abaixo:

  nome,idade,sexo
  Cesar,49,M
  Meire,48,F
  Aline,24,F
  Ana Luiza,20,F
  Natalia,26,F

Agora, experimente os seguintes comandos (observe a saída logo abaixo deles, nos exemplos abaixo):

  # sqlet.py -d',' -A exemplo.csv 'select * from A;' | sqlite3
  nome,idade,sexo
  Cesar,49,M
  Meire,48,F
  Aline,24,F
  Ana Luiza,20,F
  Natalia,26,F

Você pode observar que a chave -d indica qual o delimitador de texto entre os dados do arquivo. A chave -A indica que, para o comando SQL, o nome da base de dados será A. O programa sqlet.py "transforma" o seu arquivo csv em um dump SQL e o envia, junto com o seu comando, para o gerenciador de base de dados sqlite3. Se você quiser ver qual a mágica está sendo feita, digite simplesmente:

  # sqlet.py -d',' -A exemplo.csv 'select * from A;'

Observe o resultado:

   ------ ------ ------ ------ ------ ------ ----------
  -- SQLet interprets its arguments to generate the following SQL commands; pipe to sqlite3 to execute
   ------ ------ ------ ------ ------ ------ ----------
  -- defaults:
  .separator ' '
  .header off
   ------ ------ ------ ------ ------ ------ ----------
  .separator ','
  -- new table..
  -- table name: A
  -- file name: exemplo.csv
  -- colIndex -- colName -- colType -- sampleValue
  -- 1 -- a1 -- TEXT -- nome
  -- 2 -- a2 -- TEXT -- idade
  -- 3 -- a3 -- TEXT -- sexo
  create table A([a1] TEXT, [a2] TEXT, [a3] TEXT);
  .import exemplo.csv A
   ------ ------ ------ ------ ------ ------ ----------
  select * from A;
   ------ ------ ------ ------ ------ ------ ----------
  drop table A;
   ------ ------ ------ ------ ------ ------ ----------

Agora, diga se isso não é muito lindo!

Experimente outras consultas (observe que a chave -h1 faz com que a primeira linha seja tratada como nome de colunas):

  # sqlet.py -h1 -d',' -A exemplo.csv 'select * from A where sexo="M";' | sqlite3
  Cesar,49,M
  
  # sqlet.py -h1 -d',' -A exemplo.csv 'select nome,sexo from A where idade<"40";' | sqlite3
  Aline,F
  Ana Luiza,F
  Natalia,F

Imagine as consultas que você pode fazer, por exemplo, nos arquivos textos fornecidos pelo Portal de Dados Abertos do Governo Federal!

O SQLet permite que você use vários arquivos de texto simultaneamente, criando buscas bastante complexas. Saiba mais no site do projeto.

Vai comprar os materiais escolares para 2013? Contribua com o ano letivo das crianças da AMAM. Doe livros, cadernos e materiais escolares. Faça parte dessa corrente. Faça a diferença. Curta a página da AMAM no Facebook.

Cesar Brod ministra cursos in-house adequados à necessidade de sua empresa, além de atuar como coach de equipes ágeis. Visite nosso portal para saber mais ou entre em contato diretamente com o autor para mais informações.



 

 

Veja a relação completa dos artigos de Cesar Brod

Opinião dos Leitores

Bruno
23 Mar 2013, 09:13
Mas como mais simples?
Não seriam necessários pipes, nem nada parecido. Somente o awk:
awk -F, '{ x += $2 } END { print x }' ENTRADA.txt
joao cosme
21 Mar 2013, 16:24
ótima Dica muito boa mesmo!!!!

Concordo que pra manipular textos com certeza usaria as ferramentas do shell.... mas para fazer consultas em campos e calculos é mais fácil fazer uso do SQL por exemplo somar todas as idades do arquivo... a maneira simples seria recortar a coluna da idade fazer um loop e usar por exemplo expr..... com sql seria mais simples ./sqlet.py -d ',' -A exemplo.csv 'select sum(cast(a2 as integer)) from A ;' | sqlite3
joao cosme
21 Mar 2013, 16:14
Mas vc pode realizar consultas muito mais simples do que um monte de pipe awk grep sed.....
Bruno
19 Mar 2013, 16:46
Pois é, concordo com o Tafarel. Por esse e outros motivos, acaba sendo muito mais eficiente trabalhar com expressões regulares; isso sem mencionar o awk.
Marco
19 Mar 2013, 16:46
Isso pode ser feito com AWK.
Tafarel Carvalho
18 Mar 2013, 10:32
Parece ser muito dispendioso. Isso cria uma tabela, depois pesquisa nela e depois a exclui ao inves de trabalhar diretamente no arquivo.
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script