web-dev-qa-db-fra.com

MySQL Dump dans les fichiers texte CSV avec des noms de colonne en haut?

Dupliquer possible:
[.____] Comment exporter/vider un tableau MySQL en un fichier texte comprenant les noms de champs (AKA en-têtes ou noms de colonne)

J'utilise cet extrait SQL pour vider une table dans les fichiers texte CSV:

Sélectionnez * de la marque dans les champs Outfile "E: /Brand.csv" terminés par "," joint par "" "lignes terminées par"\n ";

Cependant, cette approche n'ajoute pas les noms de colonne au début du fichier CSV. Ma question est de savoir comment sélectionner également tous les noms de colonne/champ, comme ce que la phpmyadmin fait lorsque vous exportez la table et sélectionnez "Mettez les noms de champs dans la première ligne".

13
datasn.io

J'ai trouvé un moyen de devoir entrer manuellement ces noms aussi longtemps que vous exécutez MySQL 5 ou plus. Ici, c'est écrit comme un script Bash pour être exécuté sur une ligne de commande UNIX:

DBNAME=<database_name>
TABLE=<table_name>

FNAME=/path/to/output/dir/$(date +%Y.%m.%d)-$DBNAME.csv

#(1)creates empty file and sets up column names using the information_schema
mysql -u <username> -p<password> $DBNAME -B -e "SELECT COLUMN_NAME FROM information_schema.COLUMNS C WHERE table_name = '$TABLE';" | awk '{print $1}' | grep -iv ^COLUMN_NAME$ | sed 's/^/"/g;s/$/"/g' | tr '\n' ',' > $FNAME

#(2)appends newline to mark beginning of data vs. column titles
echo "" >> $FNAME

#(3)dumps data from DB into /var/mysql/tempfile.csv
mysql -u <username> -p<password> $DBNAME -B -e "SELECT * INTO OUTFILE '/var/mysql/tempfile.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' FROM $TABLE;"

#(4)merges data file and file w/ column names
cat /var/mysql/tempfile.csv >> $FNAME

#(5)deletes tempfile
rm -rf /var/mysql/tempfile.csv

Bien que pas la solution la plus gracieuse, je suis sûr que cela peut être comprimé dans une seule ligne par une personne qui sait SQL et/ou bash un peu mieux que moi ...

Ce que c'est:

  1. utilise le schéma d'informations de MySQL pour créer un CSV vide en-têtes de colonne
  2. ajoute une nouvelle ligne supplémentaire à ce CSV vide afin que vos données commencent à apparaître une nouvelle ligne
  3. utilise une requête "Select * en Outfile" standard "pour créer un CSV plein de données
  4. ajoute le fichier de données sur les en-têtes de colonne.
  5. supprime le fichier de données (temporaire)

Bonne chance, et si vous le nettoyez, postez vos résultats!

21
Amos

Je pense que cela fait ce que vous voulez. J'utilise MySQL 5.1.60, cela génère des noms de champs sur la première ligne. Cela utilisera "\ T" comme séparateur de champ, je ne suis pas sûr de savoir comment demander une virgule.

echo "SELECT * FROM brand;" | mysql -uXXX -pXXX databasename > brand.tsv
7
Blake Miller