Consultas SQL simples e rápidas para arquivos planos
Pergunta
Alguém conhece alguma ferramenta para fornecer consultas simples e rápidas de arquivos planos usando uma linguagem de consulta declarativa do tipo SQL? Prefiro não pagar a sobrecarga de carregar o arquivo em um banco de dados, pois os dados de entrada normalmente são jogados fora quase imediatamente após a execução da consulta.
Considere o arquivo de dados, "Animals.txt":
dog 15
cat 20
dog 10
cat 30
dog 5
cat 40
Suponha que eu queira extrair o valor mais alto para cada animal único. Eu gostaria de escrever algo como:
cat animals.txt | foo "select $1, max(convert($2 using decimal)) group by $1"
Eu posso obter quase o mesmo resultado usando sort
:
cat animals.txt | sort -t " " -k1,1 -k2,2nr
E eu sempre posso cair em awk
A partir daí, mas tudo isso parece um pouco awk
Ward (não pude resistir) quando uma linguagem do tipo SQL parece resolver o problema de maneira tão limpa.
Eu pensei em escrever um invólucro para o SQLite que criaria automaticamente uma tabela com base nos dados de entrada e procurei usar o Hive no modo de processador único, mas não posso deixar de sentir que esse problema já foi resolvido antes. Estou esquecendo de algo? Essa funcionalidade já é implementada por outra ferramenta padrão?
Halp!
Solução 6
Eu nunca consegui encontrar uma resposta satisfatória para minha pergunta, mas pelo menos encontrei uma solução para o meu problema de brinquedo usando uniq
opção "-f", da qual eu não tinha conhecimento de:
cat animals.txt | sort -t " " -k1,1 -k2,2nr \
| awk -F' ' '{print $2, " ", $1}' | uniq -f 1
o awk
A parte acima poderia, obviamente, ser ignorada se o arquivo de entrada fosse criado com colunas na ordem oposta.
Ainda estou tendo esperança de uma ferramenta do tipo SQL.
Outras dicas
eu escrevi Txtsushi Principalmente para fazer o SQL seleciona em arquivos planos. Aqui está a cadeia de comando para o seu exemplo (todos esses comandos são da Txtsushi):
tabtocsv animals.txt | namecolumns - | tssql -table animals - \ 'select col1, max(as_int(col2)) from animals group by col1'
Namecolumns é necessário apenas porque os animais.txt não possuem uma linha de cabeçalho. Você pode ter uma noção rápida do que é possível olhando através do Exemplo de scripts. Existem também links para ferramentas semelhantes na parte inferior da página principal.
Perl dbi usando Dbd :: anydata
você pode usar o sqlite. Aqui está um exemplo usando Python.
import sqlite3
conn = sqlite3.connect('/tmp/test.db')
cursor = conn.cursor()
try:
cursor.execute("""create table table1 (word varchar not null, number varchar not null)""")
except: pass
cursor.execute("insert into table1 values ('dog', '15')")
cursor.execute("insert into table1 values ('cat', '20')")
cursor.execute("insert into table1 values ('dog', '10')")
cursor.execute("select max(number) , word from table1 group by word")
print cursor.fetchall()
resultado
$ ./python.py
[(u'20', u'cat'), (u'15', u'dog')]
Eu apenas tropecei Este script python O que faz algo como o que você deseja, embora apenas suporte consultas muito básicas.
Nós teremos um Orm leve para SQLite Isso simplificaria essa tarefa sem exigir arquivos de configuração etc.
Se você pode usar o PowerShell, possui muitos recursos poderosos para analisar e consultar arquivos de texto (exemplo aqui). Caso contrário, usando .NET/MONO, você pode cortá -lo e usar o LINQ em pouco tempo.
Fiz uma ferramenta que poderia ajudar.http://www.mccoyonlinestore.com/index.php?txtsearch=mccoy_rdbmsSeu SQL pode ser "Selecione max (valor) dos animais" ou poderia "selecionar * de animais ordenar por valor desc"
Você pode procurar Drivers HXTT JDBC. Eles fornecem drivers JDBC para a maioria dos tipos de arquivos planos, Excel etc.
Você pode executar consultas simples SQL nele.
Eles têm versões de teste disponíveis também