Come importare caricare un file .sql o .csv in SQLite?


115

Devo scaricare un file .sql o .csv in SQLite (sto usando l'API SQLite3). Ho trovato solo la documentazione per importare / caricare tabelle, non interi database. In questo momento, quando digito:

sqlite3prompt> .import FILENAME TABLE 

Ottengo un errore di sintassi, poiché si aspetta una tabella e non un intero DB.


Risposte:


162

Per importare da un file SQL utilizzare quanto segue:

sqlite> .read <filename>

Per importare da un file CSV dovrai specificare il tipo di file e la tabella di destinazione:

sqlite> .mode csv <table>
sqlite> .import <filename> <table>

2
Questa è la risposta giusta, ma a volte si strozza con file CSV funky / rotti.
Eli

Sta dando l'errore "impossibile aprire db.sql", quando sto usando .read commond.
Dory

2
come ottiene i nomi delle colonne, se non sono presenti nel file csv?
sumanth232

@ krishna222, secondo la documentazione , se la tabella non esiste, la prima riga del CSV verrà utilizzata come nomi di colonna; se la tabella esiste, tutte le righe vengono trattate come dati.
alttag

26

Prova a farlo dal comando come:

cat dump.sql | sqlite3 database.db

Questo ovviamente funzionerà solo con le istruzioni SQL in dump.sql. Non sono sicuro di come importare un CSV.


Penso che questo funzionerebbe allo stesso modo, ma l'utente dovrebbe assicurarsi che le impostazioni di sqlite3 siano state configurate per.mode csv
FilBot3

Voglio solo fare un commento qui, questo in realtà è morto al 100%, sqlite3 database.db < dump.sqlè SOOOO SLOW !!! Quindi usa cat dump.sql | sqlite3 database.dbinvece! : D
Javier Buzzi

@ JavierBuzzi: scusa ma non ha senso. Questi due metodi sono equivalenti. Devi aver avuto qualcos'altro quando hai provato un metodo o l'altro. In condizioni di test stabili garantisco che non ci saranno differenze di velocità.
IcarusNM

22

Per passare da SCRATCH con SQLite DB all'importazione del CSV in una tabella:

  • Ottieni SQLite dal sito web.
  • Al prompt dei comandi eseguire sqlite3 <your_db_file_name>* Verrà creato come file vuoto.
  • Crea una nuova tabella nel tuo nuovo database. La tabella deve corrispondere ai campi CSV per l'importazione.
  • Puoi farlo con il comando SQL: CREATE TABLE <table_Name> (<field_name1> <Type>, <field_name2> <type>);

Dopo aver creato la tabella e le colonne corrispondono ai dati del file, puoi eseguire le operazioni precedenti ...

.mode csv <table_name>
.import <filename> <table_name>

@jacob fyi, questa risposta ha quasi 4 anni e la persona che l'ha pubblicata non è stata qui da oltre tre anni.
Andrew Barber

Mi hai salvato le settimane. Ho finito il mio lavoro in 3 secondi. Ho convertito un file CSV da 120 MB in .db in soli 5 secondi.
zackygaurav

11

Il comando sqlite3 .import non funzionerà per i dati CSV ordinari perché tratta qualsiasi virgola come un delimitatore anche in una stringa tra virgolette.

Ciò include il tentativo di reimportare un file csv creato dalla shell:

Create table T (F1 integer, F2 varchar);
Insert into T values (1, 'Hey!');
Insert into T values (2, 'Hey, You!');

.mode csv
.output test.csv
select * from T;

Contents of test.csv:
1,Hey!
2,"Hey, You!"

delete from T;

.import test.csv T
Error: test.csv line 2: expected 2 columns of data but found 3

Sembra che dobbiamo trasformare il csv in un elenco di istruzioni Insert, o forse funzionerà un delimitatore diverso.

A SuperUser ho visto un suggerimento per utilizzare LogParser per gestire i file CSV, ho intenzione di esaminarlo.


blairxy: L'errore che ricevi è dovuto alla virgola in "Hey, You!". Durante il caricamento della seconda riga Sqlite vede 3 colonne e rimuovendo la seconda virgola puoi caricarlo senza errori.
Shiva

10

Se sei felice di usare uno script (python), allora c'è uno script python che lo automatizza su: https://github.com/rgrp/csv2sqlite

Questo creerà automaticamente la tabella per te così come farà alcune ipotesi di base sul tipo e casting dei dati per te (quindi ad esempio funzionerà che qualcosa è un numero e imposterà il tipo di colonna su "reale").


Quasi funziona: la riga di intestazione viene importata correttamente. Tuttavia, ottengo sqlite3.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings# csv2sqlite.py {csv-file-path} {sqlite-db-path} [{table-name}]
Marcos

Hmmm, non ho mai visto quell'errore usando questo. Stavi usando dati non unicode o non utf8? In tal caso potrebbe essere necessario modificare lo script per aprire il file CSV utilizzando la codifica specifica che sta utilizzando.
Rufus Pollock

Più o meno nello stesso periodo, ho scritto una sceneggiatura di Ruby che fa la stessa cosa !! Dovrebbe funzionare anche su più file CSV contemporaneamente, indovinando il nome della tabella dal nome del file. github.com/dergachev/csv2sqlite
Dergachev

Dovremmo leggere da sys.stdin poiché dobbiamo convertire un file csv.gz da 60 GB. Oppure, ci sarebbe la possibilità di ottenere il supporto per la lettura di gzip in csv2sqlite? Grazie!
markusN

@markusN apre un problema sul tracker GitHub. In generale, mi preoccuperei di un file CSV da 100 GB + in sqlite (hai pensato a un RDB "corretto", ad esempio postgres o anche bigquery, redshift ecc.
Rufus Pollock,


1

SQLite è estremamente flessibile in quanto consente anche i comandi punto specifici di SQLite nella sintassi SQL (sebbene siano interpretati dalla CLI). Ciò significa che è possibile eseguire operazioni di questo tipo.

Crea una smstabella come questa:

# sqlite3 mycool.db '.schema sms'
CREATE TABLE sms (_id integer primary key autoincrement, Address VARCHAR, Display VARCHAR, Class VARCHAR, ServiceCtr VARCHAR, Message VARCHAR, Timestamp TIMESTAMP NOT NULL DEFAULT current_timestamp);

Quindi due file:

# echo "1,ADREZZ,DizzPlay,CLAZZ,SMSC,DaTestMessage,2015-01-24 21:00:00">test.csv

# cat test.sql
.mode csv
.header on
.import test.csv sms

Per testare l'importazione del file CSV utilizzando il file SQL, eseguire:

# sqlite3 -csv -header mycool.db '.read test.sql'

In conclusione, questo significa che puoi usare l' .importistruzione in SQLite SQL, proprio come puoi fare in qualsiasi altro RDB, come MySQL con LOAD DATA INFILEecc. Tuttavia, questo non è raccomandato.


1

Controlla i terminiql. https://gitorious.org/termsql https://gitorious.org/termsql/pages/Home

Converte il testo in SQL sulla riga di comando. (CSV è solo testo)

Esempio:

cat textfile | termsql -o sqlite.db

Per impostazione predefinita il delimitatore è uno spazio bianco, quindi per farlo funzionare con CSV che utilizza le virgole, dovresti farlo in questo modo:

cat textfile | termsql -d ',' -o sqlite.db

in alternativa puoi fare questo:

termsql -i textfile -d ',' -o sqlite.db

Per impostazione predefinita, genererà i nomi delle colonne "COL0", "COL1", se vuoi che utilizzi la prima riga per i nomi delle colonne, fai così:

termsql -i textfile -d ',' -1 -o sqlite.db

Se vuoi impostare nomi di colonna personalizzati, fai questo:

termsql -i textfile -d ',' -c 'id,name,age,color' -o sqlite.db

1

se lo stai usando in Windows, assicurati di aggiungere il percorso al db in "" e anche di usare la doppia barra \ nel percorso per assicurarti che Windows lo capisca.


0

Ecco come puoi inserire in una colonna identità:

CREATE TABLE my_table (id INTEGER PRIMARY KEY AUTOINCREMENT, name COLLATE NOCASE);
CREATE TABLE temp_table (name COLLATE NOCASE);

.import predefined/myfile.txt temp_table 
insert into my_table (name) select name from temp_table;

myfile.txt è un file in C: \ code \ db \ predefined \

data.db è in C: \ code \ db \

myfile.txt contiene stringhe separate da un carattere di nuova riga.

Se vuoi aggiungere più colonne, è più facile separarle usando il carattere pipe, che è il valore predefinito.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.