119 votes

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

J'ai besoin de jeter un .sql o .csv dans SQLite (j'utilise l'API SQLite3). Je n'ai trouvé de documentation que pour l'importation/le chargement de tables, pas de bases de données entières. Actuellement, lorsque je tape :

sqlite3prompt> .import FILENAME TABLE 

J'obtiens une erreur de syntaxe, car il s'attend à une table et non à une BD entière.

0 votes

171voto

Jay Igor Points 746

Pour importer à partir d'un fichier SQL, procédez comme suit :

sqlite> .read <filename>

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

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

2 votes

C'est la bonne réponse, mais parfois elle s'arrête sur des fichiers CSV funky/brisés.

0 votes

Il donne l'erreur "cannot open db.sql", quand j'utilise la commande .read.

2 votes

Comment obtient-il les noms des colonnes, s'ils ne sont pas présents dans le fichier csv ?

26voto

Kyle Cronin Points 35834

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.

0 votes

Je pense que cela fonctionnerait de la même manière, mais l'utilisateur devrait s'assurer que les paramètres de sqlite3 sont configurés pour .mode csv

0 votes

Je veux juste faire un commentaire, c'est tout à fait exact, sqlite3 database.db < dump.sql est TELLEMENT LENTE ! !! Alors utilisez cat dump.sql | sqlite3 database.db à la place ! :D

2 votes

Désolé, mais ça n'a aucun sens. Ces deux méthodes sont équivalentes. Vous avez dû avoir quelque chose d'autre en cours lorsque vous avez essayé une méthode ou l'autre. Dans des conditions de test stables, je vous garantis qu'il n'y aura pas de différence de vitesse.

23voto

Jake Wyman Points 91

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

  • Obtenez SQLite à partir du site web.
  • À une invite de commande, exécutez sqlite3 <your_db_file_name> *Il sera créé comme un 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>

0 votes

@jacob juste pour info, cette réponse est presque 4 ans et la personne qui l'a posté n'est plus là depuis plus de trois ans.

1 votes

Vous avez sauvé mes semaines. J'ai terminé mon travail en 3 secondes. J'ai converti un fichier CSV de 120MB en .db en seulement 5 secondes.

12voto

blairxy Points 128

La commande sqlite3 .import ne fonctionne 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 la tentative 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 de déclarations d'insertion, ou peut-être qu'un autre délimiteur fonctionnera.

Sur SuperUser, j'ai vu une suggestion d'utiliser LogParser pour traiter les fichiers csv, je vais y réfléchir.

1 votes

Blairxy : L'erreur que vous obtenez est due à la virgule dans "Hey, You !". En chargeant la 2ème ligne, Sqlite voit 3 colonnes et en enlevant la 2ème virgule, vous pouvez le charger sans erreur.

11voto

Rufus Pollock Points 585

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, et fera quelques suppositions de base sur le type et les données pour vous (par exemple, il comprendra que quelque chose est un nombre et définira le type de colonne à "réel").

0 votes

Cela fonctionne presque - la ligne d'en-tête importe bien. Cependant, j'obtiens ensuite 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}]

0 votes

Hmmm, je n'ai jamais vu cette erreur en utilisant ceci. Avez-vous utilisé des données non-unicode ou non-utf8 ? Si c'est le cas, vous devrez peut-être modifier le script pour ouvrir le fichier CSV en utilisant l'encodage spécifique qu'il utilise.

0 votes

A peu près au même moment, j'ai écrit un ruby script 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X