Existe-t-il un moyen simple d'exécuter une requête MySQL à partir de la ligne de commande Linux et de produire 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
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.
REPLACE()
dans votre requête pour échapper les guillemets.Réponses:
Sur http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/
L'utilisation de cette commande ne permet pas d'exporter les noms des colonnes.
Notez également que ce
/var/lib/mysql-files/orders.csv
sera sur le serveur qui exécute MySQL. L'utilisateur sous lequel s'exécute le processus MySQL doit être autorisé à écrire dans le répertoire choisi, sinon la commande échouera.Si vous souhaitez écrire la 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.
la source
Qui est séparé par des tabulations. Pipe comme ça pour obtenir un vrai CSV (merci @therefromhere):
la source
| sed 's/\t/,/g'
Cela vous donnera un fichier séparé par des tabulations. Comme les virgules (ou les chaînes contenant des virgules) ne sont pas échappées, il n'est pas simple de changer le délimiteur en virgule.
la source
Voici une façon assez grossière de le faire. Je l'ai trouvé quelque part, je ne peux 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, même si une expression rationnelle prouve l'écriture uniquement.
Explication de l'expression régulière:
Donc, tout mettre ensemble:
la source
mysql -B
. Si vous séparez l'expression régulière en instructions individuelles sur des lignes distinctes, il serait assez simple (pour quelqu'un qui connaît l'expression régulière) de comprendre.","
et un certain nombre d'autres choses. Une expression régulière n'est pas le moyen de résoudre ce problèmeUnix / Cygwin uniquement, canalisez-le via 'tr':
NB: Cela ne gère ni les virgules intégrées, ni les onglets intégrés.
la source
Cela m'a sauvé plusieurs fois. Rapide et ça marche!
Exemple:
Pour être complet, vous pouvez convertir en csv (mais soyez prudent car les onglets peuvent être à l'intérieur des valeurs de champ - par exemple les champs de texte)
la source
La solution OUTFILE proposée par Paul Tomblin entraîne l'écriture d'un fichier sur le serveur MySQL lui-même, donc cela ne fonctionnera que si vous avez FILE accès , ainsi qu'un 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 au CSV (par exemple, si votre objectif final est d'importer vers Excel), la solution de Serbaut (en utilisant
mysql --batch
et éventuellement--raw
) est la voie à suivre.la source
MySQL Workbench peut exporter des jeux d'enregistrements vers CSV, et il semble très bien gérer les virgules dans les champs. Le CSV s'ouvre très bien dans OpenOffice.
la source
Que diriez-vous:
la source
mysql -uUser -pPassword your_database < my_requests.sql | awk 'BEGIN{OFS="=";} {print $1,$2}' > out.csv
Toutes les solutions ici à ce jour, à l'exception de celle de MySQL Workbench, sont incorrectes et très probablement dangereuses (c'est-à-dire des problèmes de sécurité) pour au moins certains contenus possibles dans la base de données mysql.
MYSQL Workbench (et de même PHPMyAdmin) fournit une solution formellement correcte, mais est conçu pour télécharger la sortie vers l'emplacement d'un utilisateur. Ils ne sont pas aussi utiles pour des choses comme l'automatisation de l'exportation de données.
Il n'est pas possible de générer un csv correct et fiable à partir de la sortie de
mysql -B -e 'SELECT ...'
car cela ne peut pas coder les retours chariot et les espaces blancs dans les champs. Le drapeau '-s' de mysql fait s'échapper la barre oblique inverse et peut conduire à une solution correcte. Cependant, l'utilisation d'un langage de script (avec des structures de données internes décentes qui ne sont pas bash) et des bibliothèques où les problèmes d'encodage ont déjà été soigneusement résolus est beaucoup plus sûre.J'ai pensé à écrire un script pour cela, mais dès que j'ai pensé à ce que je pourrais l'appeler, j'ai pensé à rechercher une œuvre préexistante du même nom. Bien que je ne l'ai pas examiné en détail, la solution sur https://github.com/robmiller/mysql2csv semble prometteuse. En fonction de votre application, l'approche yaml pour spécifier les commandes SQL peut ou peut 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 les serveurs Debian Squeeze. Oui, je sais que je pourrais utiliser RVM, mais je préfère ne pas maintenir cela pour un but aussi simple.
J'espère que quelqu'un vous indiquera un outil approprié, qui a fait l'objet de quelques tests. Sinon, je le mettrai probablement à jour lorsque j'en trouverai ou en rédigerai un.
la source
Beaucoup de réponses sur cette page sont faibles car elles ne gèrent pas le cas général de ce qui peut se produire au format CSV. par exemple, des virgules et des guillemets intégrés dans des champs et d'autres conditions qui finissent toujours par apparaître. Nous avons besoin d'une solution générale qui fonctionne pour toutes les données d'entrée CSV valides.
Voici une solution simple et solide en Python:
Nommez ce fichier
tab2csv
, placez-le sur votre chemin, donnez-lui des autorisations d'exécution, puis utilisez-le comme ceci:Les fonctions de gestion Python CSV couvrent les cas d'angle pour les formats d'entrée CSV.
Cela pourrait être amélioré pour gérer de très gros fichiers via une approche de streaming.
la source
Depuis votre ligne de commande, vous pouvez faire ceci:
Crédits: exportation d'une table d'Amazon RDS dans un fichier csv
la source
CREATE TABLE () (SELECT data FROM other_table ) ENGINE=CSV ;
la source
Cette réponse utilise Python et une bibliothèque tierce populaire, PyMySQL . Je l'ajoute car la bibliothèque csv de Python est suffisamment puissante pour gérer correctement de nombreuses versions différentes de
.csv
et aucune autre réponse n'utilise de code Python pour interagir avec la base de données.la source
C'est simple, et cela fonctionne sur n'importe quoi sans avoir besoin du mode batch ou des fichiers de sortie:
Explication:
"
par""
dans chaque champ ->replace(field1, '"', '""')
concat('"', result1, '"')
concat_ws(',', quoted1, quoted2, ...)
C'est ça!
la source
NULL
valeurs seront ignoréesconcat_ws()
, ce qui entraînera une incompatibilité de colonne. Pour éviter cela, utilisez simplement une chaîne vide à la place:IFNULL(field, '')
(ou tout ce que vous utilisez pour représenterNULL
)Alternativement à la réponse ci-dessus, vous pouvez avoir une table MySQL qui utilise le moteur CSV.
Ensuite, vous aurez un fichier sur votre disque dur qui sera toujours au format CSV que vous pourrez simplement copier sans le traiter.
la source
Pour développer les réponses précédentes, la ligne unique suivante exporte une seule table en tant que fichier séparé par des tabulations. Il convient à l'automatisation, exportant la base de données tous les jours environ.
Idéalement, nous pouvons utiliser la même technique pour lister les tables de MySQL et décrire les champs sur une seule table:
la source
mysql -B -D mydatabase -e 'select * from mytable' | sed -e 's/\t/,/g'
sed -e 's/\t/,/g'
n'est sûre que si vous êtes sûr que vos données ne contiennent pas de virgules ou d'onglets.En s'appuyant sur user7610, voici la meilleure façon de le faire. Avec
mysql outfile
il y avait 60 minutes de propriété de fichier et des problèmes d'écrasement.Ce n'est pas cool, mais cela a fonctionné en 5 minutes.
php csvdump.php localhost root password database tablename > whatever-you-like.csv
la source
De plus, si vous effectuez la requête sur la ligne de commande Bash, je pense que la
tr
commande peut être utilisée pour remplacer les onglets par défaut par des délimiteurs arbitraires.$ echo "SELECT * FROM Table123" | mysql Database456 | tr "\t" ,
la source
Voici ce que je fais:
Le script Perl (extrait d'ailleurs) fait un bon travail de conversion des champs espacés de tabulation en CSV.
la source
perl -F"\t" -lane 'print join ",", map {s/"/""/g; /^\d+(?:\.\d+)?$/ ? $_ : qq("$_")} @F '
- le vôtre ne1.2.3
Pas exactement au format CSV, mais la
tee
commande du client MySQL peut être utilisée pour enregistrer la sortie dans un fichier local :Vous pouvez le désactiver à l'aide de
notee
.Le problème
SELECT … INTO OUTFILE …;
est qu'il nécessite l'autorisation d'écrire des fichiers sur le serveur.la source
En utilisant la solution publiée par Tim, j'ai créé ce script bash pour faciliter le processus (le mot de passe root est demandé, mais vous pouvez facilement modifier le script pour demander à tout autre utilisateur):
Il va créer un fichier nommé: database.table.csv
la source
Si PHP est configuré sur le serveur, vous pouvez utiliser mysql2csv pour exporter un fichier CSV (réellement valide) pour une requête mysql abitrary. Voir ma réponse sur MySQL - SELECT * INTO OUTFILE LOCAL?pour un peu plus de contexte / info.
J'ai essayé de conserver les noms des options de
mysql
donc il devrait être suffisant de fournir les options--file
et--query
:"Installer"
mysql2csv
via(télécharger le contenu de l'essentiel, vérifier la somme de contrôle et le rendre exécutable).
la source
Ce qui a fonctionné pour moi:
Aucune des solutions sur ce fil n'a fonctionné pour mon cas particulier, j'avais des données json assez à l'intérieur d'une des colonnes, qui seraient gâchées dans ma sortie csv. Pour ceux qui ont un problème similaire, essayez plutôt les lignes terminées par \ r \ n.
Un autre problème pour ceux qui essaient d'ouvrir le fichier csv avec Microsoft Excel, gardez à l'esprit qu'il y a une limite de 32 767 caractères qu'une seule cellule peut contenir, au-dessus de ce qu'elle déborde sur les lignes ci-dessous. Pour identifier les enregistrements d'une colonne présentant le problème, utilisez la requête ci-dessous. Vous pouvez ensuite tronquer ces enregistrements ou les gérer comme vous le souhaitez.
la source
Si vous obtenez une erreur de
secure-file-priv
alors, également après avoir déplacé l'emplacement de votre fichier de destination à l'intérieur deC:\ProgramData\MySQL\MySQL Server 8.0\Uploads
et également après la requête -SELECT * FROM attendance INTO OUTFILE 'C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\FileName.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
ne fonctionne pas, vous devez simplement changer
\
(dosseret) de la requête en/
(forwardsplash)Et ça marche !!
Exemple:
Chaque fois que vous exécutez la requête réussie, il génère à chaque fois le nouveau fichier csv! Cool non?
la source
Petit script bash pour effectuer une requête simple sur les vidages CSV, inspiré de https://stackoverflow.com/a/5395421/2841607 .
la source
Le script bash suivant fonctionne pour moi. Il obtient éventuellement le schéma des tables demandées.
la source
J'ai rencontré le même problème et la réponse de Paul n'était pas une option car c'était RDS. Le remplacement de l'onglet par des virgules n'a pas fonctionné car les données comportaient des virgules et des tabulations intégrées. J'ai trouvé que le mycli qui est une alternative sans rendez -vous pour le client mysql prend en charge la sortie csv hors de la boîte avec le
--csv
drapeaula source
Si vous obtenez cette erreur pendant que vous essayez d'exporter votre fichier
et vous ne pouvez pas résoudre cette erreur. Vous pouvez faire une chose en exécutant simplement ce script python
la source
Si PHP est installé sur la machine que vous utilisez, vous pouvez écrire un script PHP pour ce faire. Il nécessite l'installation PHP a l'extension MySQL installée.
Vous pouvez appeler l'interpréteur PHP à partir de la ligne de commande comme ceci:
J'inclus le
--php-ini
commutateur, car vous devrez peut-être utiliser votre propre configuration PHP qui active l'extension MySQL. Sur PHP 5.3.0+, cette extension est activée par défaut, il n'est donc plus nécessaire d'utiliser la configuration pour l'activer.Ensuite, vous pouvez écrire votre script d'exportation comme n'importe quel script PHP normal:
L'avantage de cette méthode est qu'elle n'a aucun problème avec varchar et les champs de texte qui contiennent du texte contenant des sauts de ligne. Ces champs sont correctement cités et ces retours à la ligne seront interprétés par le lecteur CSV comme faisant partie du texte, et non comme des séparateurs d'enregistrement. C'est quelque chose qui est difficile à corriger par la suite avec sed .
la source