Comment exporter un fichier CSV à partir de la ligne de commande MySQL

Contenu

Transport de données entre applications.

Fichiers de valeurs séparés par des virgules (CSV) ils sont un moyen de transférer des données entre les applications. Les bases de données comme MySQL et les tableurs comme Excel prennent en charge l'importation et l'exportation via CSV, donc tu peux utiliser fichiers CSV échanger des données entre les deux.

Les fichiers CSV sont en texte brut, ils sont donc naturellement légers et faciles à exporter depuis MySQL.

À partir du serveur de base de données

Si vous avez accès au serveur sur lequel MySQL s’exécute, vous pouvez exporter une sélection à l’aide de l’icône INTO OUTFILE commander.

SELECT id, colonne1, column2 FROM table
INTO OUTFILE '/tmp/mysqlfiles/table.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY 'n'

Cela générera un fichier CSV pour /tmp/mysqlfiles/table.csv, ou où vous l’avez configuré. Vous devrez vous assurer que l’utilisateur exécutant MySQL (généralement mysql O root) possède la propriété et l’accès en écriture au répertoire.

Vous devrez également vous assurer que secure_file_priv La configuration permet à MySQL d'accéder à ce répertoire. Cette, par défaut, bloque l'accès en lecture et en écriture aux requêtes SQL. C'est une bonne chose; si votre code est vulnérable à l'injection SQL, tout attaquant potentiel n'aurait accès qu'à MySQL et non au reste du système de fichiers.

Vous pouvez ajouter à la liste blanche des répertoires spécifiques en modifiant votre fichier de configuration MySQL (généralement situé dans /etc/my.cnf) inclure:

[mysqld]
fichier-sécurisé-priv = "/tmp/mysqlfiles"

Ce qui permettra à MySQL de lire et d'écrire sur /tmp/mysqlfiles/ (avec quoi devez-vous créer mkdir). Une fois que MySQL peut exporter des fichiers, devrait pouvoir exécuter la requête et générer des fichiers CSV.

Avec lui ENCLOSED BY réglage, les virgules seront correctement échappées, par exemple:

"3","Échapper, cette","aussi, cette"

Que vous pouvez prendre et importer directement dans n'importe quel tableur ou autre logiciel.

Feuille de calcul d'une liste séparée par des virgules.

Veuillez noter que le fichier CSV exporté n'inclut pas les en-têtes de colonne, mais les colonnes seront dans le même ordre que le SELECT déclaration. En même temps, les valeurs nulles seront exportées en tant que N, quel est le comportement attendu, mais si tu veux changer ça, vous pouvez modifier la sélection en enveloppant ifnull(field, "") autour de leurs champs dans leur SELECT déclaration.

Depuis la ligne de commande MySQL

Si vous n'avez qu'un accès en ligne de commande à l'instance MySQL, et vous n'avez pas accès au serveur lui-même (comme quand tu ne le gères pas, dans le cas d Amazon RDS), le problème est un peu plus complexe. Alors que vous pouvez utiliser FIELDS TERMINATED BY ',' sur le serveur pour générer une liste séparée par des virgules, MySQL CLI sera tabulé par défaut.

Entrez simplement une requête à partir de la ligne de commande et dirigez-la vers un fichier:

mysql -u racine -e "sélectionner * de la base de données;" > sortie.tsv

Parce que la sortie MySQL est à onglets, c'est ce qu'on appelle le fichier TSV, pour “valeurs séparées par des tabulations”, et cela peut fonctionner à la place de votre fichier CSV dans certains programmes, comme les importations de feuilles de calcul. Mais ce n'est pas un fichier CSV et le convertir en un est délicat.

Vous pouvez simplement remplacer chaque onglet par une virgule, qui fonctionnerait mais le ferait échouer s'il y a des virgules dans les données d'entrée. Si vous êtes absolument sûr qu'il n'y a pas de virgules dans votre fichier TSV (consulter grep), vous pouvez remplacer les onglets par sed:

sed "s/t/,/g" sortie.tsv > sortie.csv

Mais si vous avez des virgules dans vos données, vous devrez utiliser un beaucoup plus longtemps expression régulière:

sed "s/'/'/;s/t/","/g;s/^/"/;s/$/"/;s/n//g" sortie.tsv > sortie.csv

Cela échappera correctement aux champs cités, ce qui résoudra le problème des virgules.

Noter: le caractère de tabulation t il est non standard. Sur macOS et BSD, n'est pas activé, ce qui génère un désordre de chacun “t” minuscules causant sed insérer des virgules erronées. Pour résoudre ce, vous devez utiliser un caractère de tabulation littéral au lieu de t:

sed "s/ /,/g" sortie.tsv > sortie.csv

Si vos données d'entrée contiennent des onglets, vous n'avez pas de chance et devrez générer vous-même un fichier CSV avec un langage de script.

Faites-le manuellement avec un vrai langage de programmation

MySQL (et la plupart des bases de données) sont conçus pour interagir avec lui, donc vous avez probablement déjà une sorte de langage de programmation connecté à MySQL. La plupart des langues peuvent également écrire sur le disque, vous pouvez donc créer vos propres scripts de sortie CSV en lisant directement les champs de la base de données, les échapper correctement et écrire un fichier délimité par des virgules.

Un exemple en Python.

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.