2009-09-23 35 views
12

Devo applicare una query SQL a file CSV (file di testo separati da virgole). Il mio SQL è predefinito da un altro strumento e non è idoneo a cambiare. Può contenere selezioni e alias di tabella incorporati nella parte FROM.Esegui SQL su file CSV tramite JDBC

Per il mio compito ho trovato due open-source (questo è un requisito di progetto) librerie che forniscono i driver JDBC:

  1. CsvJdbc
  2. XlSQL
  3. JBoss Teiid
  4. Creare un Apache Derby DB, carica tutti i CSV come tabelle ed esegue la query.

Questi sono i problemi che ho incontrato:

  1. che non accetta la sintassi SQL (che utilizza seleziona interne e alias di tabella). Inoltre, non è stato mantenuto dal 2004.
  2. non ho potuto farlo funzionare, in quanto ha come dipendenza un parser SAX che causa un'eccezione durante l'analisi di altri documenti. Allo stesso modo, nessun cambiamento dal 2004.
  3. Non ho controllato se supporta la sintassi, ma sembra un sovraccarico. Ha bisogno di diverse entità definite (Virtual Databases, Bindings). Dalla mailing list mi hanno detto che l'ultima release supporta la creazione in runtime degli oggetti richiesti. Qualcuno lo ha usato per un compito così semplice (normalmente può connettersi a diversi tipi di dati, come CSV, XML o altri DBS e creare uno virtuale, unificato)?
  4. Questo può anche essere fatto facilmente?

Dalle 4 cose che ho considerato/provato, solo 3 e 4 mi sembrano valide. Qualche consiglio su questi o su qualsiasi altro modo in cui posso interrogare i miei file CSV?

Acclamazioni

risposta

3

Se SQL è predefinito e non può essere cambiata la soluzione migliore è quella di caricare il file CSV in un database ed eseguire query contro di essa.

Apache Derby è un'opzione valida, quindi lo è MySQL, che ha anche un CSV storage engine o PostgreSQL.

Il vostro SQL utilizzare qualsiasi proprietarie funzioni/estensioni? Se è così, ciò potrebbe limitare le tue scelte.

+0

Sì, utilizza la sottostringa e le concatenazioni. –

3

direi db incorporato. Suggerirei Javadb (Derby incorporato nell'API Java) o H2 se non ti interessa estrarre la dipendenza extra.

9

vorrei caricare i dati nel HSQL (HypersonicSQL). Pure Java, SQL corretto, ben collaudato. Praticamente qualsiasi altra cosa ha un'impronta più grande.

+1

In effetti HSQLDB è l'unica soluzione suggerita in grado di aprire un file CSV esistente come una tabella SQL. Permette sia di eseguire query SQL direttamente sul file CSV e di aggiornare i record. – fredt

+1

http://hsqldb.org/doc/guide/ch06.html contiene ulteriori dettagli –

+0

Ciao @Vladimir cosa succede se il file csv che voglio elaborare è molto grande in termini di 5-10 GB? – u449355

0

C'è uno script Groovy, gcsvsql che consente di trattare i file CSV come tabelle di database, inclusi i join. Con gcsvsql si possono fare cose come:

gcsvsql "select * from people.csv in cui l'età> 40"

gcsvsql "selezionare people.name, i bambini.bambino da people.csv, children.csv dove people.name = children.name"

gcsvsql "selezionare avg (score) da people.csv in cui l'età < 40"

si possono trovare questo script, che si basa sul motore di database h2, al codice di Google qui:

http://code.google.com/p/gcsvsql/

1

Se si vogliono trattare i file CSV i database all'interno di un programma Java, si dovrebbe guarda il h2 database engine. Ha un bel supporto per leggere/scrivere file CSV e lavorare con i database in memoria. È un successore di hsql, più veloce e con funzionalità aggiuntive. Puoi leggere il supporto csv nel tutorial h2.

+0

Puoi leggere quanto è facile farlo usando h2 in uno script Groovy in questo post del blog: http://bayesianconspiracy.blogspot.com/2010 /02/executing-arbitrary-sql-on-csv-files.html – Kolmogorov

1

forse un po 'in ritardo, mi dispiace per quello.

Sto sviluppando lo csvjdbc per oltre un anno e da qualche settimana ho diritti di "amministratore" su quel progetto, quindi sono stato in grado di rilasciare la versione più recente che avevo prodotto. ha bisogno di tutto ciò di cui "noi" (noi: io e i miei colleghi attuali), e aggiungo le cose man mano che i bug vengono archiviati.

dare un'occhiata ora e decidere di nuovo. (la documentazione web ha ancora bisogno di revisione, per una migliore comprensione, controllare i casi di test, che sono molto estesi).

+0

seleziona incorporato? alias di tabella? no, non ancora disponibile lì. ma poi di nuovo, sentiti libero di presentare un bug report con una query non funzionante e chissà ... – mariotomo

0

Lo so, si tratta di un caso molto vecchio, ma ...

CsvJdbc è una biblioteca fredda, ma ci sono alcuni problemi che utilizzano DbUtils mentre ResultsSets mappatura POJO. Una seconda cosa negativa è che non hanno un buon supporto per diversi tipi di dati.

Dopo aver giocato con CSVJdbc Userò uno stupido CsvParser per leggere i file e pomparli in un HsqlDB o qualcosa del genere.

+0

hai segnalato i problemi con csvjdbc? l'attuale manutentore (non più io) è molto pronto a raccogliere problemi seri. – mariotomo

+0

No, non l'ho fatto. Non sono in grado di creare un biglietto lì. – Mirko

+0

dovresti essere in grado di creare un ticket lì una volta effettuato il login/registrazione. gli utenti anonimi non sono autorizzati a creare né aggiornare i biglietti. Immagino per evitare gli spammer ... ma essere più specifico, quali "problemi" hai incontrato e quale "buon supporto" ti aspetti? – mariotomo

Problemi correlati