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 awkWard (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!

Foi útil?

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 uniqopçã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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top