2010-02-17 7 views
14

Qualcuno sa di strumenti per fornire query semplici e veloci di file flat utilizzando un linguaggio di query dichiarativo simile a SQL? Preferisco non pagare l'overhead del caricamento del file in un DB poiché i dati di input vengono generalmente eliminati quasi immediatamente dopo l'esecuzione della query.Query SQL semplici e veloci per file flat

consideri il file di dati, "animals.txt":

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

Supponiamo che io voglio per estrarre il valore più alto per ogni animale unico. Vorrei scrivere qualcosa di simile:

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

posso ottenere quasi lo stesso risultato utilizzando sort:

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

E posso sempre cadere in awk da lì, ma tutto questo si sente un po 'awk corsia (non ha resistito) quando un linguaggio simile a SQL sembrerebbe risolvere il problema in modo così pulito.

Ho pensato di scrivere un wrapper per SQLite che creerebbe automaticamente una tabella in base ai dati di input e ho cercato di utilizzare Hive in modalità a processore singolo, ma non posso fare a meno di sentire che questo problema ha stato risolto prima. Mi sto perdendo qualcosa? Questa funzionalità è già implementata da un altro strumento standard?

Halp!

risposta

0

sono mai riuscito a trovare una risposta soddisfacente alla mia domanda, ma ho fatto almeno trovare una soluzione al mio problema giocattolo che utilizza uniq s opzione "-f", che ero stato a conoscenza di:

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

La porzione precedente di awk potrebbe, ovviamente, essere saltata interamente se il file di input è stato creato con colonne nell'ordine opposto.

Sto ancora dando speranza per uno strumento simile a SQL, però.

0

faremo Ho un lightweight ORM for sqlite che semplificare questa operazione, senza richiedere alcun file di configurazione, ecc

Se è possibile utilizzare PowerShell ha un sacco di potenti funzionalità per l'analisi e l'interrogazione di file di testo (example here). In caso contrario, utilizzando .NET/Mono è possibile ridurlo e utilizzare LINQ in pochissimo tempo.

+0

mi piacerebbe essere in grado di fare tutto bene dal guscio, che questa soluzione non sembra sostenere. – plinehan

+0

Quale? Powershell è una miscela di steroidi che ti permette di fare tutto dalla shell. Per quanto riguarda OrmLite (che è quello che userei), scrivi un programma di poche righe che importa tutti i dati nel tuo db di scelta, quindi puoi usare sqlite3.exe per interrogare dal prompt dei comandi. – mythz

1

è possibile utilizzare SQLite. Ecco un esempio 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() 

uscita

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

Mi piacerebbe essere in grado di fare tutto direttamente dalla shell, che questa soluzione non sembra supportare. – plinehan

1

Ho appena imbattuti in this Python script che fa qualcosa di simile a ciò che si vuole, anche se supporta solo le query molto semplici.

3

Ho scritto TxtSushi principalmente per eseguire selezioni SQL su file flat.Qui è la catena di comando per l'esempio (tutti questi comandi sono da TxtSushi):

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

namecolumns è necessaria solo perché animals.txt non ha una riga di intestazione. Puoi avere un'idea rapida di ciò che è possibile guardando attraverso lo example scripts. Ci sono anche collegamenti a strumenti simili nella parte inferiore della pagina principale.

+0

Molto bello. Quanto bene scala? Spero di poter gestire file muti-gigabyte che superano la RAM disponibile sulla mia macchina. – plinehan

+1

Effettua qualsiasi tipo di filtraggio di righe o selezione di colonne usando un approccio di streaming ma non appena gli chiedi di fare qualcosa che richiede un ordinamento (raggruppa, partecipa, ordina per tutti i tipi), vuole leggere l'intera tabella in memoria . In questo caso puoi dare l'opzione -external-sort che dice a TxtSushi di ordinare su disco, ma la mia attuale implementazione di ordinamento esterno è molto inefficiente e richiede un po 'di lavoro. – Keith

0

È possibile cercare HXTT JDBC Drivers. Forniscono driver JDBC per la maggior parte dei tipi di file flat, ecc. Ecc.

È possibile eseguire semplici query SQL su di esso.

Hanno versioni di prova disponibili, nonché

Problemi correlati