Question Comment afficher les résultats de la requête MySQL au format CSV?


Existe-t-il un moyen simple d'exécuter une requête MySQL à partir de la ligne de commande Linux et d'afficher les résultats dans CSV  format?

Voici ce que je fais maintenant:

mysql -u uid -ppwd -D dbname << EOQ | sed -e 's/        /,/g' | tee list.csv
select id, concat("\"",name,"\"") as name
from students
EOQ

Cela devient compliqué quand il y a beaucoup de colonnes qui doivent être entourées de guillemets, ou s'il y a des guillemets dans les résultats qui doivent être échappés.


932
2017-12-10 15:59


origine


Réponses:


De http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/

SELECT order_id,product_name,qty
FROM orders
WHERE foo = 'bar'
INTO OUTFILE '/var/lib/mysql-files/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

En utilisant cette commande, les noms de colonnes ne seront pas exportés.

Notez également que /var/lib/mysql-files/orders.csv sera sur le serveur cela fonctionne MySQL. L'utilisateur sous lequel le processus MySQL s'exécute doit avoir des permissions pour écrire dans le répertoire choisi, sinon la commande échouera.

Si vous voulez écrire une sortie sur votre machine locale à partir d'un serveur distant (en particulier une machine hébergée ou virtualisée telle que Heroku ou Amazon RDS), cette solution ne convient pas.


1425
2017-12-10 16:07



$ mysql your_database --password=foo < my_requests.sql > out.csv

Ce qui est séparé par des tabulations. Pipe-le comme ça pour obtenir un vrai CSV (merci @therefromhere):

... .sql | sed 's/\t/,/g' > out.csv

359
2018-04-08 16:53



mysql --batch, -B

Imprimer les résultats en utilisant l'onglet comme séparateur de colonne, avec chaque ligne sur un   nouvelle ligne. Avec cette option, mysql n'utilise pas le fichier historique.   Le mode batch entraîne un format de sortie non tabulaire et l'échappement de   caractères spéciaux. L'échappement peut être désactivé en utilisant le mode brut; voir   la description de l'option --raw.

Cela vous donnera un fichier séparé par des tabulations. Puisque les virgules (ou les chaînes contenant une virgule) ne sont pas échappées, il n'est pas simple de changer le délimiteur en virgule.


170
2017-09-30 10:51



Voici une façon assez grossière de le faire. Trouvé quelque part, ne peut prendre aucun crédit

mysql --user=wibble --password wobble -B -e "select * from vehicle_categories;" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > vehicle_categories.csv

Fonctionne plutôt bien. Encore une fois si un regex prouve écrire seulement.


Explication Regex:

  • s /// signifie substituer ce qui est entre le premier // et ce qui est entre le second //
  • le "g" à la fin est un modificateur qui signifie "toutes les instances, pas seulement les premières"
  • ^ (dans ce contexte) signifie début de ligne
  • $ (dans ce contexte) signifie fin de ligne

Donc, tout mettre ensemble:

s/'/\'/          replace ' with \'
s/\t/\",\"/g     replace all \t (tab) with ","
s/^/\"/          at the beginning of the line place a "
s/$/\"/          at the end of the line place a "
s/\n//g          replace all \n (newline) with nothing

112
2018-03-22 17:31



Unix /Cygwin seulement, passez le 'tr':

mysql <database> -e "<query here>" | tr '\t' ',' > data.csv

N.B .: Cela ne gère ni les virgules ni les onglets incorporés.


68
2017-10-11 15:19



La solution OUTFILE fournie par Paul Tomblin provoque l'écriture d'un fichier sur le serveur MySQL lui-même, donc cela ne fonctionnera que si vous avez FICHIER accès, ainsi que l'accès de connexion ou d'autres moyens pour récupérer le fichier de cette boîte.

Si vous ne disposez pas d'un tel accès et que la sortie délimitée par des tabulations est un substitut raisonnable de CSV (par exemple, si votre objectif final est d'importer vers Excel), alors la solution de Serbaut (en utilisant mysql --batch et éventuellement --raw) est le chemin à parcourir.


33
2018-06-22 13:48



Que diriez-vous:

mysql your_database -p < my_requests.sql | awk '{print $1","$2}' > out.csv

30
2017-11-10 18:41



Cela m'a sauvé une ou deux fois. Rapide et ça marche!

--lot

--brut

Exemple:

sudo mysql -udemo_user -p -h127.0.0.1 --port=3306 \
   --default-character-set=utf8 --database=demo_database \
   --batch --raw < /var/demo_sql_query.sql > /var/demo_csv_export.csv

30
2018-01-29 13:52



MySQL Workbench peut exporter des jeux d'enregistrements au format CSV, et il semble très bien gérer les virgules dans les champs. Le CSV s'ouvre très bien dans OpenOffice.


28
2018-06-26 17:15



Toutes les solutions ici à ce jour, à l'exception du workbench Mysql, sont incorrectes et très probablement dangereuses (c'est-à-dire des problèmes de sécurité) pour au moins un contenu possible dans la base de données mysql.

Mysql Workbench (et de même PHPMyAdmin) fournissent une solution formellement correcte, mais sont conçus pour télécharger la sortie vers l'emplacement d'un utilisateur. Ils ne sont pas très utiles pour des choses comme l'automatisation de l'exportation de données.

Il n'est pas possible de générer de manière fiable le csv correct à partir de la sortie de mysql -B -e 'SELECT ...' car cela ne peut pas encoder les retours chariot et les espaces blancs dans les champs. L'indicateur '-s' de mysql fait un backslash s'échappant, et pourrait conduire à une solution correcte. Cependant, l'utilisation d'un langage de script (avec des structures de données internes correctes, et non pas bash), et des bibliothèques où les problèmes d'encodage ont déjà été soigneusement résolus est beaucoup plus sûr.

J'ai pensé écrire un script pour cela, mais dès que j'ai pensé à ce que j'appellerais, il m'est venu à l'esprit de chercher un travail préexistant du même nom. Bien que je ne l'aie pas étudié à fond, la solution à https://github.com/robmiller/mysql2csv Cela semble prometteur. En fonction de votre application, l'approche yaml pour spécifier les commandes SQL pourrait ou non ne pas plaire. Je ne suis pas non plus ravi de l'exigence d'une version plus récente de ruby ​​que celle fournie en standard avec mon ordinateur portable Ubuntu 12.04 ou mes serveurs Debian Squeeze. Oui, je sais que je pourrais utiliser le RVM, mais je préférerais ne pas le maintenir pour un objectif aussi simple.

Espérons que quelqu'un nous indiquera un outil approprié, qui a eu un peu de test. Sinon, je vais probablement mettre à jour quand je trouve ou écris un.


23
2017-10-11 05:04