Comment importer un fichier .sql ou .csv dans SQLite?

115

Je dois vider un fichier .sql ou .csv dans SQLite (j'utilise l'API SQLite3). Je n'ai trouvé que de la documentation pour importer / charger des tables, pas des bases de données entières. En ce moment, quand je tape:

sqlite3prompt> .import FILENAME TABLE 

J'obtiens une erreur de syntaxe, car il attend une table et non une base de données entière.

happythenewsad
la source
Documentation
pertinente

Réponses:

162

Pour importer à partir d'un fichier SQL, utilisez les éléments suivants:

sqlite> .read <filename>

Pour importer à partir d'un fichier CSV, vous devrez spécifier le type de fichier et la table de destination:

sqlite> .mode csv <table>
sqlite> .import <filename> <table>
Jay Igor
la source
2
C'est la bonne réponse, mais parfois cela s'étouffe avec des fichiers CSV géniaux / cassés.
Eli
Il donne l'erreur "impossible d'ouvrir db.sql", lorsque j'utilise .read commond.
Dory
2
comment obtient-il les noms de colonnes, s'ils ne sont pas présents dans le fichier csv?
sumanth232
@ krishna222, selon la documentation , si la table n'existe pas, la première ligne du CSV sera utilisée comme nom de colonne; si la table existe, toutes les lignes sont traitées comme des données.
alttag
26

Essayez de le faire à partir de la commande comme:

cat dump.sql | sqlite3 database.db

Cela ne fonctionnera évidemment qu'avec les instructions SQL dans dump.sql. Je ne sais pas comment importer un CSV.

Kyle Cronin
la source
Je pense que cela fonctionnerait exactement de la même manière, mais l'utilisateur devrait s'assurer que les paramètres sqlite3 ont été configurés pour.mode csv
FilBot3
Je veux juste faire un commentaire ici, c'est en fait 100% mort, sqlite3 database.db < dump.sqlc'est SOOOO SLOW !!! Alors utilisez cat dump.sql | sqlite3 database.dbplutôt! : D
Javier Buzzi
@JavierBuzzi: Désolé mais cela n'a aucun sens. Ces deux méthodes sont équivalentes. Vous devez avoir eu quelque chose d'autre en cours lorsque vous avez essayé une méthode ou une autre. Dans des conditions de test stables, je vous garantis qu'il n'y aura pas de différence de vitesse.
IcarusNM
22

Pour passer de SCRATCH avec SQLite DB à l'importation du CSV dans une table:

  • Obtenez SQLite sur le site Web.
  • À l'invite de commande, exécutez sqlite3 <your_db_file_name>* Il sera créé en tant que fichier vide.
  • Créez une nouvelle table dans votre nouvelle base de données. La table doit correspondre à vos champs CSV pour l'importation.
  • Vous faites cela par la commande SQL: CREATE TABLE <table_Name> (<field_name1> <Type>, <field_name2> <type>);

Une fois que vous avez créé la table et que les colonnes correspondent à vos données du fichier, vous pouvez faire ce qui précède ...

.mode csv <table_name>
.import <filename> <table_name>
Jake Wyman
la source
@jacob juste pour info, cette réponse a presque 4 ans et la personne qui l'a postée n'est pas ici depuis plus de trois ans.
Andrew Barber
Vous avez sauvé mes semaines. J'ai fini mon travail en 3 secondes. J'ai converti un fichier CSV de 120 Mo en .db en seulement 5 secondes.
zackygaurav
11

La commande sqlite3 .import ne fonctionnera pas pour les données csv ordinaires car elle traite toute virgule comme un délimiteur, même dans une chaîne entre guillemets.

Cela inclut d'essayer de réimporter un fichier csv qui a été créé par le 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

Il semble que nous devions transformer le csv en une liste d'instructions Insert, ou peut-être qu'un délimiteur différent fonctionnera.

Chez SuperUser, j'ai vu une suggestion d'utiliser LogParser pour traiter les fichiers csv, je vais examiner cela.

blairxy
la source
blairxy: L'erreur que vous obtenez est due à une virgule dans "Hey, You!". Lors du chargement de la 2ème ligne, Sqlite voit 3 colonnes et en supprimant la 2ème virgule, vous pouvez le charger sans erreur.
Shiva
10

Si vous êtes heureux d'utiliser un script (python), il existe un script python qui automatise cela à: https://github.com/rgrp/csv2sqlite

Cela créera automatiquement la table pour vous, ainsi que des calculs de base de type et de conversion de données pour vous (ainsi, par exemple, cela fonctionnera comme un nombre et définira le type de colonne sur "réel").

Rufus Pollock
la source
Fonctionne presque - la ligne d'en-tête importe OK. Cependant, j'obtiens 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, je n'ai jamais vu cette erreur en utilisant ça. Utilisiez-vous des données non-Unicode ou non-utf8? Si tel est le cas, vous devrez peut-être modifier le script pour ouvrir le fichier CSV en utilisant le codage spécifique qu'il utilise.
Rufus Pollock
À peu près à la même époque, j'ai écrit un script ruby ​​qui fait la même chose !! Il devrait même fonctionner sur plusieurs fichiers CSV à la fois, en devinant le nom de la table à partir du nom du fichier. github.com/dergachev/csv2sqlite
Dergachev
Nous aurions besoin de lire à partir de sys.stdin car nous devons convertir un fichier csv.gz de 60 Go. Ou, y aurait-il une chance d'obtenir le support de lecture gzip dans csv2sqlite? Merci!
markusN
@markusN ouvre un problème sur le tracker github. En général, je m'inquiéterais d'un fichier de 100 Go + CSV dans sqlite (avez-vous pensé à un RDB "approprié", par exemple postgres ou même bigquery, redshift, etc.
Rufus Pollock
1

SQLite est extrêmement flexible car il autorise également les commandes dot spécifiques à SQLite dans la syntaxe SQL (bien qu'elles soient interprétées par CLI). Cela signifie que vous pouvez faire des choses comme celle-ci.

Créez un smstableau comme celui-ci:

# 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);

Puis deux fichiers:

# 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

Pour tester l'importation du fichier CSV à l'aide du fichier SQL, exécutez:

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

En conclusion, cela signifie que vous pouvez utiliser l' .importinstruction dans SQLite SQL, comme vous pouvez le faire dans n'importe quel autre RDB, comme MySQL avec LOAD DATA INFILEetc. Cependant, ce n'est pas recommandé.

not2qubit
la source
1

Consultez les termesql. https://gitorious.org/termsql https://gitorious.org/termsql/pages/Home

Il convertit le texte en SQL sur la ligne de commande. (CSV est juste du texte)

Exemple:

cat textfile | termsql -o sqlite.db

Par défaut, le délimiteur est un espace, donc pour le faire fonctionner avec CSV qui utilise des virgules, vous le feriez comme ceci:

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

vous pouvez également le faire:

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

Par défaut, il générera les noms de colonne "COL0", "COL1", si vous voulez qu'il utilise la première ligne pour les noms de colonnes, procédez comme suit:

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

Si vous souhaitez définir des noms de colonnes personnalisés, procédez comme suit:

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

si vous l'utilisez dans Windows, assurez-vous d'ajouter le chemin de la base de données dans "" et d'utiliser également la double barre oblique \ dans le chemin pour vous assurer que Windows le comprend.

MahD
la source
0

Voici comment vous pouvez insérer dans une colonne d'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 est un fichier dans C: \ code \ db \ predefined \

data.db est dans C: \ code \ db \

myfile.txt contient des chaînes séparées par un caractère de nouvelle ligne.

Si vous souhaitez ajouter plus de colonnes, il est plus facile de les séparer à l'aide du caractère pipe, qui est la valeur par défaut.

l'amour en direct
la source