Exporter de sqlite vers csv à l'aide d'un script shell

88

Je crée un script shell pour exporter une requête sqlite vers un fichier csv, comme ceci:

 #!/bin/bash
./bin/sqlite3 ./sys/xserve_sqlite.db ".headers on"
./bin/sqlite3 ./sys/xserve_sqlite.db ".mode csv"
./bin/sqlite3 ./sys/xserve_sqlite.db ".output out.csv"
./bin/sqlite3 ./sys/xserve_sqlite.db "select * from eS1100_sensor_results;"
./bin/sqlite3 ./sys/xserve_sqlite.db ".exit"

Lors de l'exécution du script, la sortie apparaît à l'écran, au lieu d'être enregistrée dans "out.csv". Cela fonctionne de la même manière avec la ligne de commande, mais je ne sais pas pourquoi le script shell ne parvient pas à exporter les données vers le fichier.

Qu'est-ce que je fais mal?

Rorro
la source

Réponses:

125

sqlite3

Vous avez un appel distinct sqlite3pour chaque ligne; au moment où vous selectcourez, votre .out out.csva été oublié.

Essayer:

#!/bin/bash
./bin/sqlite3 ./sys/xserve_sqlite.db <<!
.headers on
.mode csv
.output out.csv
select * from eS1100_sensor_results;
!

au lieu.

méthodes sh / bash

Vous pouvez soit appeler votre script avec une redirection:

$ your_script >out.csv

ou vous pouvez insérer ce qui suit comme première ligne dans votre script:

exec >out.csv

La première méthode vous permet de spécifier différents noms de fichiers, tandis que la seconde renvoie vers un nom de fichier spécifique. Dans les deux cas, la ligne .output out.csvpeut être ignorée.

tzot
la source
Super, merci, maintenant ça marche! (et il faut ">>" au lieu de ">", mais je suis un newbei sous linux: D)
Rorro
1
Si une réponse ici répond réellement à votre question, vous devez cliquer sur la coche sous le total des votes de la réponse (elle doit apparaître en gris clair pour vous). Cela marque la question comme une réponse.
tzot
Désolé pour le retard, je suis un vrai débutant: D
Rorro
<<! ... !est exactement ce dont j'avais besoin. Merci.
Rostyslav Druzhchenko le
172

Au lieu des commandes dot, vous pouvez utiliser les options de commande sqlite3:

sqlite3 -header -csv my_db.db "select * from my_table;" > out.csv

Cela en fait un one-liner.

En outre, vous pouvez exécuter un fichier de script sql:

sqlite3 -header -csv my_db.db < my_script.sql > out.csv

Utilisez sqlite3 -helppour voir la liste des options disponibles.

Hollister
la source
3
Beaucoup, beaucoup mieux ... cela devrait être la solution acceptée! KISS :-)
pvandenberk
5
Cette solution fonctionnera également sur Windows, à condition que sqlite3 soit sur votre chemin ou dans le même répertoire.
amenthes
7

J'ai récemment créé un script shell qui pourra prendre les tables d'un fichier db et les convertir en fichiers csv.

https://github.com/darrentu/convert-db-to-csv

N'hésitez pas à me poser des questions sur mon script :)

DarrenNEEDSHELP
la source
3
Cela m'a aidé. Vous devriez copier-coller vos 10 lignes de code dans votre réponse, alors le vote positif que j'ai déjà donné vous semblera plus justifié.
mxmlnkn
Le script manque de guillemets autour du nom de la table (il renvoie une erreur si le nom de la table comporte des tirets)
Eric F.
0

Bien que la question porte sur le script shell, je pense que cela aidera peu de ceux qui sont juste dérangés par le transfert des données de la base de données sqlite3 vers un fichier csv.

J'ai trouvé un moyen très pratique de le faire avec le navigateur Firefox en utilisant l'extension SQLite Manager.

Connectez-vous simplement à votre fichier de base de données sqlite dans firefox (gestionnaire SQlite -> connecter la base de données) puis Table -> Exporter la table. Vous serez servi avec d'autres options sur lesquelles vous pouvez simplement cliquer et essayer ...

À la fin, vous obtenez un fichier csv avec la table que vous avez choisie pour l'exportation.

infocloggé
la source
0
Using command line for Linux:

user@dell-Admin: sqlite3 #activate your sqlite database first
sqlite> .tables #search for tables if any available if already created one.
sqlite> .schema #if you want to check the schema of the table.

# once you find your table(s), then just do the following:

sqlite> .headers on   #export along with headers (column names)
sqlite> .mode csv     #file type is csv
sqlite> .output example.csv   #you want to provide file name to export
sqlite> SELECT * from events;    #If entire table is needed or select only required
sqlite> .quit    #finally quit the sqlite3

Recherchez maintenant dans votre système le fichier example.csv et vous l'obtiendrez.

Jainmiah
la source