Extraire un fichier CSV depuis un table SQL en ligne de commande

Parfois, on a besoin d’extraire des informations d’une table SQL et on a pas les outils sous la main comme phpmyadmin ou Adminer.

Il est bien sûr possible de faire une extraction en ligne de commande avec « mysql » mais le résultat est sous la forme de tableau difficilement utilisable dansExcel ou tout autre tableur.

Alors voici une petite manipulation qui vous permettre facilement d’extraire les données en utilisant la commande sed :


mysql <arguments habituels>  -e "SELECT * FROM foo" | sed '\''s/\t/";"/g;s/^/"/;s/$/"/;s/\n//g'\'' > foo.csv

Explications

Dans cette commande, nous utilisons sed pour remplacer les tabulations par « ; » (s/\t/ »; »/g), le 1er caractère et le dernier par un  » ( s/^/ »/ et s/$/ »/).

Il est possible d’ajouter un alias pour ne pas avoir à taper la commande sed à chaque fois (cet alias peut être ajouter au fichier .bashrc par exemple)

alias mysql2csv='sed '\''s/\t/","/g;s/^/"/;s/$/"/;s/\n//g'\''''

Et on utilisera alors la commande suivante


mysql <arguments habituels>  -e "SELECT * FROM foo" | mysql2csv > foo.csv

Une autre solution avec la commande tr pour obtenir un fichier avec ; comme séparateur

mysql <arguments habituels>  -e "SELECT * FROM foo" | tr "\t" ";" > foo.csv

Dans cet exemple, le premier argument « \t » permet de remplacer la tabulation par « ; » dans le résultat de la requête.

Il est enfin possible de modifier la requête pour n’avoir que certains colonnes de la table, ou bien même faire des requîtes plus complexes qui seront exportées en CSV.

Astuce

Ajouter l’argument -N à la commande MySQL pour ne pas avoir le nom des colonnes dans le résultat.

Bonus : Un exemple de script bash

#!/bin/bash
# Vérifie que deux arguments sont fournis
if [ "$#" -ne 3 ]; then
echo "Utilisation : $0 <separateur> <database> <table_sql>"
exit 1
fi
separateur="$1"
database="$2"
table_sql="$3"
test = echo "$table_sql" | grep -q ' ';
if [ $test  ]; then
echo "Le nom de la table contient des espaces"
exit 1
fi
mysql "$database" -e "SELECT * FROM $table_sql" | tr "\t" "$separateur"
exit 0

Laisser un commentaire