Pregunta

¿Alguien sabe de ninguna herramienta para proporcionar consultas sencillas, rápidas de archivos planos utilizando un lenguaje de consulta SQL declarativo-como? Yo prefiero no pagar los gastos indirectos de la carga del archivo en una base de datos ya que los datos de entrada es normalmente expulsado casi inmediatamente después de que se ejecute la consulta.

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 puedo caer siempre en awk desde allí, pero todo esto se siente un poco awkward (no podía resistir a) cuando un lenguaje similar a SQL parece resolver el problema de manera limpia.

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

Halp!

¿Fue útil?

Solución 6

Nunca he conseguido encontrar una respuesta satisfactoria a mi pregunta, pero yo al menos encontrar una solución a mi problema juguete usando uniqs "f" opción, 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 porción awk anterior podría, obviamente, ser omitido por completo si el archivo de entrada se han creado con columnas en el orden opuesto.

Todavía estoy mantener la esperanza de una herramienta similar a SQL, sin embargo.

Otros consejos

TxtSushi que ver principalmente 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 hacerse una idea rápida de lo que es posible mirar a través de la scripts de ejemplo . También hay enlaces a herramientas similares en la parte inferior de la página principal.

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')]

Me tropecé a través de este script Python el que hace algo parecido a lo que desee, aunque sólo admite consultas muy básicas.

Vamos Tengo un ligero para sqlite que simplificaría esta tarea sin necesidad de archivos de configuración, etc.

Si usted puede usar PowerShell tiene una gran cantidad de potentes capacidades para el análisis y la consulta de archivos de texto ( ejemplo aquí ). De lo contrario, el uso de .NET / Mono se puede cortar que en LINQ y utilizar en ningún momento.

Hice una herramienta que podría ayudar. http://www.mccoyonlinestore.com/index.php?txtSearch=mccoy_rdbms SQL podría ser "SELECT MAX (valor) de los animales" o podría por "SELECT * FROM para animales por el valor de la descripción"

Puede buscar HXTT JDBC Drivers . Ellos proporcionan controladores JDBC para la mayoría del tipo de archivos planos, Excel, etc.

Puede ejecutar consultas SQL simple en él.

Ellos tienen versiones de prueba, así

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top