2010-02-17 14 views
14

¿Alguien sabe de alguna herramienta para proporcionar consultas simples y rápidas de archivos planos utilizando un lenguaje de consulta declarativo similar a SQL? Prefiero no pagar los gastos generales de cargar el archivo en un DB, ya que los datos de entrada normalmente se descartan casi inmediatamente después de ejecutar la consulta.Consultas SQL simples y rápidas para archivos planos

considere el archivo de datos "animals.txt":

dog 15 
cat 20 
dog 10 
cat 30 
dog 5 
cat 40 

Supongamos que quiero extraer el valor más alto para cada animal único. Me gustaría escribir algo como:

cat animals.txt | foo "select $1, max(convert($2 using decimal)) group by $1" 

puedo conseguir casi el mismo resultado utilizando sort:

cat animals.txt | sort -t " " -k1,1 -k2,2nr 

Y siempre puedo caer en awk desde allí, pero todo esto se siente un poco awk sala (no pude resistir) cuando un lenguaje similar a SQL parecería resolver el problema tan limpiamente.

He considerado escribir un contenedor para SQLite que crearía automáticamente una tabla basada en los datos de entrada, y he analizado el uso de Hive en modo de procesador único, pero no puedo evitar sentir que este problema sido resuelto antes ¿Me estoy perdiendo de algo? ¿Esta funcionalidad ya está implementada por otra herramienta estándar?

Halp!

Respuesta

0

Nunca he conseguido encontrar una respuesta satisfactoria a mi pregunta, pero yo al menos encontrar una solución a mi problema juguete usando uniq s opción "-f", que me había dado cuenta de:

cat animals.txt | sort -t " " -k1,1 -k2,2nr \ 
| awk -F' ' '{print $2, " ", $1}' | uniq -f 1 

La parte anterior de awk podría, obviamente, omitirse por completo si el archivo de entrada se creó con columnas en el orden opuesto.

Aún tengo la esperanza de tener una herramienta similar a SQL.

0

Tendremos que tienen una lightweight ORM for sqlite que simplificar esta tarea sin necesidad de archivos de configuración, etc.

Si puede usar PowerShell tiene una gran cantidad de potentes capacidades para el análisis y la consulta de archivos de texto (example here). De lo contrario, si usa .NET/Mono, puede cortarlo y usar LINQ en muy poco tiempo.

+0

que me gustaría ser capaz de hacer todo bien de la cáscara, lo que no parece que esta solución para soportar. – plinehan

+0

¿Cuál? Powershell es bash en esteroides que te permite hacer todo desde el caparazón. En cuanto a OrmLite (que es lo que usaría), escribes un programa de algunas líneas que importa todos los datos a tu db de elección, entonces puedes usar el sqlite3.exe para consultar desde el símbolo del sistema. – mythz

1

puede utilizar SQLite. Aquí hay un ejemplo 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() 

salida

$ ./python.py 
[(u'20', u'cat'), (u'15', u'dog')] 
+0

Me gustaría poder hacer todo bien desde el shell, que esta solución no parece ser compatible. – plinehan

1

yo sólo encontré con this Python script el que hace algo como lo que quiere, a pesar de que sólo es compatible con consultas muy básicas.

3

Escribí TxtSushi principalmente para hacer SQL selecciona en archivos planos.Aquí está la cadena de mando por su ejemplo (todos estos comandos son de TxtSushi):

tabtocsv animals.txt | namecolumns - | tssql -table animals - \ 
'select col1, max(as_int(col2)) from animals group by col1'

namecolumns sólo es necesaria porque animals.txt no tiene una fila de encabezado. Puede obtener una idea rápida de lo que es posible mirando el example scripts. También hay enlaces a herramientas similares en la parte inferior de la página principal.

+0

Muy agradable. ¿Qué tan bien escala? Espero tratar con archivos muti-gigabyte que exceden la RAM disponible en mi máquina. – plinehan

+1

Realiza cualquier tipo de filtrado de fila o selección de columnas mediante un enfoque de transmisión pero tan pronto como le pida que haga cualquier cosa que requiera una ordenación (agrupar por, unir, ordenar por todos los órdenes) quiere leer la tabla completa en la memoria . En este caso, puede dar la opción -external-sort que le dice a TxtSushi que ordene en su lugar el disco, pero mi implementación actual de clasificación externa es muy ineficiente y necesita algo de trabajo. – Keith

0

Puede buscar HXTT JDBC Drivers. Proporcionan controladores JDBC para la mayoría de los tipos de archivos planos, Excel, etc.

Puede ejecutar consultas SQL simples en él.

Ellos tienen versiones de prueba, así

Cuestiones relacionadas