Importer CSV dans SQLite

117

J'essaye d'importer un fichier csv dans une table SQLite.

Exemple csv:

1,2
5,6
2,7

Exemple de commande:

sqlite> create table foo(a, b);
sqlite> .separator ,
sqlite> .import test.csv foo
Error: test.csv line 1: expected 2 columns of data but found 4

Je ne sais même pas pourquoi il trouverait quatre colonnes avec six éléments de données et deux colonnes.

Molly Walters
la source
Il semble que la commande attend des en-têtes de colonne dans la première ligne et que le terminateur de ligne n'est pas reconnu comme tel. 6 - 2 = 4
mechanical_meat
Puis-je spécifier un terminateur de ligne ou y en a-t-il un dans mon csv?
Molly Walters
1
Il ne semble pas que vous puissiez spécifier le terminateur de ligne à partir de l'outil de ligne de commande SQLite. Avez-vous un éditeur de texte (comme le Bloc-notes sous Windows, mais mieux) qui vous montrera les caractères de fin de ligne? Il existe trois variantes principales: \r\nsur Windows, \nsur * nix (inclut les nouveaux Mac), \rsur les anciens Mac.
mechanical_meat
J'utilise BBEdit, mais je ne vois aucun de ces caractères à la fin des lignes. J'ai essayé de les ajouter manuellement, mais cela ne semble rien faire ...
Molly Walters
1
Ce site Web peut convertir un fichier CSV (ou Excel) en SQLite - converttosqlite.com
Code Slinger

Réponses:

154

Ce qui est également dit dans les commentaires, SQLite voit votre entrée comme 1, 25, 62, 7. J'ai également eu un problème avec, et dans mon cas, il a été résolu en changeant "séparateur" en ".mode csv". Vous pouvez donc essayer:

sqlite> create table foo(a, b);
sqlite> .mode csv
sqlite> .import test.csv foo

La première commande crée les noms de colonne de la table. Cependant, si vous souhaitez que les noms de colonne hérités du fichier csv, vous pouvez simplement ignorer la première ligne.

NumesSanguis
la source
83
Pour les autres personnes qui arrivent ici à partir d'une recherche, si la première ligne de votre fichier csv contient les noms de colonnes, vous pouvez omettre la première create tablecommande et sqlite utilisera les noms de colonnes du fichier csv.
EarlCrapstone
2
@EarlCrapstone: pourriez-vous élaborer? Cela ne semble pas fonctionner pour moi.
d33tah le
3
@ d33tah Regardez ces exemples . Notez que la première ligne contient les noms de colonnes Year,Make,Model,Description,Priceet non les données réelles. Si tel est le cas avec votre fichier CSV, vous n'avez pas besoin de créer manuellement la table à l'aide de la create tablecommande. La .importcommande utilisera la première ligne de votre fichier pour déterminer les noms de colonne et créer la table en conséquence. Vous devez toujours inclure le nom de la table dans la commande. Les mêmes informations de la documentation SQLite .
EarlCrapstone
Pourquoi vous installez-vous .mode? N'est-ce pas uniquement pour la sortie?
Alan
Si vous constatez que la table générée regroupe plusieurs colonnes ensemble, vérifiez que vous n'utilisez pas de mot réservé tel que typepour un nom de colonne CSV.
paulvs
29

Voici comment je l'ai fait.

  • Créer / convertir le fichier csv pour qu'il soit séparé par des tabulations (\ t) ET non entouré de guillemets (sqlite interprète les guillemets littéralement - dit les anciens documents)
  • Entrez le shell sqlite de la base de données à laquelle les données doivent être ajoutées

    sqlite> .separator "\t" ---IMPORTANT! should be in double quotes sqlite> .import afile.csv tablename-to-import-to

gyaani_guy
la source
pour plusieurs lignes, mon tsv devait spécifier le séparateur de ROW avec cette commande .separator "\t" "\r"
mfink
1
Lors de la discussion des formats de fichier, tsv! = Csv
Alan
24

Je fusionne ici les informations des réponses précédentes avec ma propre expérience. Le plus simple est d'ajouter les en-têtes de tableau séparés par des virgules directement à votre fichier csv, suivis d'une nouvelle ligne, puis de toutes vos données csv.

Si vous ne faites plus jamais de choses sur sqlite (comme moi), cela pourrait vous éviter une ou deux recherches sur le Web:

Dans le shell Sqlite, entrez:

$ sqlite3 yourfile.sqlite
sqlite>  .mode csv
sqlite>  .import test.csv yourtable
sqlite>  .exit

Si vous n'avez pas installé Sqlite sur votre Mac, exécutez

$ brew install sqlite3

Vous devrez peut-être effectuer une recherche sur le Web pour savoir comment installer Homebrew.

lukas_o
la source
1
Comment gérer les unescaped " characteralertes?
TMOTTM
Si vous créez un tableau avant l'importation, il ne recherchera pas les en-têtes.
Rolf
Je dois mettre le fichier dans le même dossier où se trouve sqlite3.exe. Puis-je utiliser un autre chemin pour le fichier csv?
Jaydeep Karena du
Point mineur: "Si Sqlite n'est pas installé sur votre Mac" ... AFAIK il est installé par défaut.
Laryx Decidua le
8

avant la commande .import, tapez ".mode csv"

zeo
la source
5
.mode est pour la sortie uniquement
DeliriumTremens
9
Apparemment non. Depuis la section doc .import: Notez qu'il est important de définir le "mode" sur "csv" avant d'exécuter la commande ".import". Ceci est nécessaire pour empêcher le shell de ligne de commande d'essayer d'interpréter le texte du fichier d'entrée comme un autre format.
Richard - Rogue Wave Limited
8

Comment importer un fichier csv dans sqlite3

  1. Créer une base de données

    sqlite3 NYC.db
  2. Définir le mode et le nom de la table

    .mode csv tripdata
  3. Importez les données du fichier csv dans sqlite3

    .import yellow_tripdata_2017-01.csv tripdata
  4. Trouver des tables

    .tables
  5. Trouvez votre schéma de table

    .schema tripdata
  6. Rechercher des données de table

    select * from tripdata limit 10;
  7. Comptez le nombre de lignes dans le tableau

    select count (*) from tripdata;
sivamani
la source
4

Avec Termsql, vous pouvez le faire en une seule ligne:

termsql -i mycsvfile.CSV -d ',' -c 'a,b' -t 'foo' -o mynewdatabase.db

user3573558
la source
le lien a été cassé, l'avez changé pour le repo github - veuillez clarifier!
Andreas Niedermair
3

J'ai eu exactement le même problème (sur OS X Maverics 10.9.1 avec SQLite3 3.7.13, mais je ne pense pas que SQLite soit lié à la cause). J'ai essayé d'importer des données csv enregistrées à partir de MS Excel 2011, qui d'ailleurs. utilise ';'comme séparateur de colonnes. J'ai découvert que le fichier csv d'Excel utilise toujours le caractère de nouvelle ligne de Mac OS 9 fois, le changer en unix newline a résolu le problème. AFAIR BBEdit a une commande pour cela, ainsi que Sublime Text 2.

adass
la source
2
C'est plus facile à utiliser tr -s '\r' '\n'et cela fonctionnera avec toutes sortes de fichiers aléatoires.
Donal Fellows
1

Suis les étapes:-

  1. 1] nom sqlite3 2] .mode csv nomtable 3] .import nomfichier.csv nomtable
Lalit Bangad
la source
0

Comme certains sites Web et autres articles le spécifient, il suffit de jeter un coup d'œil à celui-ci. https://www.sqlitetutorial.net/sqlite-import-csv/

Nous n'avons pas besoin de spécifier le séparateur pour le csvfichier, car csv signifie séparé par des virgules. sqlite> .separator ,pas besoin de cette ligne.

sqlite> create table cities(name, population);
sqlite> .mode csv
sqlite> .import c:/sqlite/city_no_header.csv cities

Cela fonctionnera parfaitement :)

PS: Mes cities.csv avec en-tête.


name,population
Abilene,115930
Akron,217074
Albany,93994
Albuquerque,448607
Alexandria,128283
Allentown,106632
Amarillo,173627
Anaheim,328014
Dupinder Singh
la source
2
N'oubliez pas de courir .save someFileNameà la fin. Il m'a fallu une heure pour le trouver pour enfin exporter ce fichier de base de données en mémoire sur le disque 😅
ioopl