Domanda

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

Considera il file di dati "animals.txt":

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

Supponiamo di voler estrarre il valore più alto per ogni animale unico.Vorrei scrivere qualcosa del tipo:

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 fare un salto awk da lì, ma tutto questo sembra un po' awkward (non ho potuto resistere) quando un linguaggio simile a SQL sembrerebbe risolvere il problema in modo così pulito.

Ho preso in considerazione la possibilità di scrivere un wrapper per SQLite che crei automaticamente una tabella basata sui dati di input e ho esaminato l'utilizzo di Hive in modalità processore singolo, ma non posso fare a meno di pensare che questo problema sia stato risolto prima.Mi sto perdendo qualcosa?Questa funzionalità è già implementata da un altro strumento standard?

Aiuto!

È stato utile?

Soluzione 6

sono mai riuscito a trovare una risposta soddisfacente alla mia domanda, ma ho fatto almeno trovare una soluzione al mio problema giocattolo che utilizza uniqs "-f" opzione, 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 awk sopra possono, ovviamente, essere saltato tutto se il file di input sono stati creati con colonne nell'ordine opposto.

Sono ancora una speranza per uno strumento di SQL-like, però.

Altri suggerimenti

TxtSushi soprattutto a che fare SQL seleziona il file flat. Qui è la catena di comando per il tuo 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. È possibile ottenere un rapido senso di ciò che è possibile, cercando attraverso la script di esempio . Ci sono anche link a strumenti simili presenti sul fondo della pagina principale.

Perl DBI utilizzando DBD :: AnyData

puoi usare sqlite.Ecco un esempio utilizzando 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()

produzione

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

Ho appena imbattuto in questo script Python che fa qualcosa di simile a quello che si vuole, anche se supporta solo le query di base.

Ci ho un leggero per SQLite che semplificherebbe questo compito 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 ( esempio qui ). In caso contrario, utilizzando .NET / Mono è possibile tagliare che fino e utilizzare LINQ in pochissimo tempo.

Ho fatto uno strumento che potrebbe aiutare. http://www.mccoyonlinestore.com/index.php?txtSearch=mccoy_rdbms SQL potrebbe essere "Selezionare Max (valore) da animali" o potrebbe dalla "SELECT * FROM ordine animali in base al valore disc"

È possibile cercare i HXTT JDBC Driver . Essi forniscono driver JDBC per la maggior parte il tipo di file flat, excel ecc.

È possibile eseguire query SQL semplici su di esso.

Hanno versioni di prova disponibili pure

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top