1340 votes

La façon de sortie de requête MySQL résultats au format csv?

Est-il un moyen facile pour exécuter une requête MySQL à partir de la ligne de commande de linux et de sortie les résultats au format csv?

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

Il devient malpropre quand il y a beaucoup de colonnes qui doivent être entourés par des guillemets, ou si il y a des citations dans les résultats qui doivent être échappés.

1928voto

Paul Tomblin Points 83687

À partir 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
INTO OUTFILE '/tmp/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'

522voto

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

Ce qui est onglet séparé. Il Pipe comme ça pour obtenir un vrai CSV (merci @therefromhere):

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

228voto

serbaut Points 2351

mysql --batch, -B

Imprimer les résultats à l'aide de l'onglet comme le séparateur de colonnes, chaque ligne sur un nouvelle ligne. Avec cette option, mysql n'utilise pas le fichier d'historique. Lot de résultats en mode non-tableaux de format de sortie et d'échapper à des caractères spéciaux. Échappement peut être désactivée en utilisant le mode raw; voir la description de la --raw option.

Cela vous donnera un onglet fichiers séparés. Depuis des virgules (ou de chaînes de caractères contenant des virgules) ne sont pas échappé, il n'est pas simple de changer le séparateur de virgule.

169voto

Tim Harding Points 926

Voici un assez ardu façon de faire. Trouvé quelque part, ne peuvent pas prendre tout le 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 assez bien. Encore une fois si une regex prouve en écriture seule.


Regex Explication:

  • s/// des moyens de substitution ce qui se trouve entre la première // avec ce qui se trouve entre la deuxième //
  • le "g" à la fin est un modificateur qui signifie "toutes les, par exemple, pas juste d'abord"
  • ^ (dans ce contexte) signifie en début de ligne
  • $ (dans ce contexte) signifie la fin de la ligne

Donc, en mettant tout cela 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

42voto

Leland Woodbury Points 161

Le OUTFILE solution donnée par Paul Tomblin cause d'un fichier écrit sur le serveur MySQL lui-même, de sorte que cela ne fonctionne que si vous avez un FICHIER d'accès, ainsi que l'accès de connexion ou d'autres moyens pour récupérer le fichier à partir de cette zone.

Si vous ne disposez pas d'un tel accès, et délimité par des tabulations de sortie est un substitut raisonnable pour CSV (par exemple, si votre objectif final est d'importer d'Excel), puis Serbaut de la solution (à l'aide d' mysql --batch et, facultativement, --raw) est le chemin à parcourir.

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