web-dev-qa-db-fra.com

Exporter la table MySQL dans un fichier csv

J'ai une table MySQL qui doit être retirée sous forme de fichier csv, la requête que j'ai utilisée est

SELECT "ID","NAME","SALARY","SAL1","SAL2","SAL3","SAL4","SAL5","SAL6","SAL7","SAL8","SAL9","SAL10","SAL11","SAL12","SAL13","SAL14","SAL15","SAL16","SAL17","SAL18","SAL19","SAL20","SAL21","SAL22","SAL23","SAL24","SAL25","SAL26"
UNION ALL
SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

Cette requête fonctionne, que se passe-t-il si j'ai 200 noms de colonne? Existe-t-il un moyen de le faire sans le taper manuellement?

24
user3304713

Cette commande vous donne presque ce que vous voulez, et elle fonctionne même avec un serveur distant. La seule mise en garde est qu'il génère un fichier TSV (les champs sont séparés par un onglet).

mysql mydb -e "select * from mytable" -B > mytable.tsv 

Mais vous pouvez le convertir en CSV en utilisant sed, comme suggéré dans cette réponse

mysql mydb -e "select * from mytable" -B | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > mytable.csv
53
Rems
DESCRIBE addstock25;

Retirez la première colonne et les 3 premières entrées de cette colonne (cela dépend de votre utilisation). Vous obtiendrez la liste des champs dans addstock25.

Cela n'apportera que des noms de champ utilisant des tables virtuelles dérivées du noyau ... appelé schéma d'information.

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_NAME`='foo';

Disons que le nom de cette requête serait sq_fieldnamelist

Ainsi, la table ci-dessus a une colonne et elle a les noms de champ de la table "foo".

Si écrivez directement comme ceci

    SELECT (sq_fieldnamelist)
    UNION ALL
    SELECT *
    FROM addstock25
    INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
    FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n

Mysql donnera une erreur. "la sous-requête renvoie plusieurs lignes"

Nous devons modifier sq_fieldnamelist pour concattre toutes les entrées dos à dos séparées par des virgules.

Select GROUP_CONCAT(COLUMN_NAME)
FROM
(SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_NAME`='ffd_companies'
LIMIT 3,100
) AS fafa
GROUP BY 'COLUMN_NAME' // this group by is just to make group concat work

Disons que c'est sq_fieldnamelist2

Si nous modifions sq_fieldnamelist comme ceci. Il renverra seulement une valeur qui est tous les noms de champ séparés par des virgules. Alors maintenant, nous pouvons mettre cette sous-requête dans votre instruction select pour acquérir les champs nécessaires.

SELECT (sq_fieldnamelist2)
UNION ALL
SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n

Vous devez modifier LIMIT 3,100 dans sq_fieldnamelist2 pour votre propre usage.

disons que votre table est comme fil1, fil2 ... filN, sal1, sal2, sal3 ...., salI pour voir les seuls champs de salaire que vous devez utiliser LIMIT N,x>I+N. si vous voulez voir tout utiliser LIMIT 0,x>N+I

4
user2102266

Je ne vois pas pourquoi tu ne peux pas faire

SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n

?

2
pacifist

J'ai intégré le script pour un code simple basé sur l'interface utilisateur. Ici, vous pouvez saisir une requête et obtenir simplement le fichier csv contenant toutes les lignes, y compris les noms de colonne.

Ce script fonctionne pour les systèmes Windows et Linux.

https://github.com/Bihari12/databasetocsv

Cela enregistrerait le résultat dans un fichier csv dans le même dossier dans lequel le code existe.

1
Vineet Bihari Gupta

Je pense que vous cherchez quelque chose comme ça.

    SET @sql = NULL;
        SELECT GROUP_CONCAT("'",COLUMN_NAME,"'")
          FROM
        (SELECT `COLUMN_NAME`
        FROM `INFORMATION_SCHEMA`.`COLUMNS` 
        WHERE `TABLE_SCHEMA` = 'yourdatabasename'
        and `TABLE_NAME`='ffd_companies'
        ) AS colnames
        GROUP BY 'COLUMN_NAME' 
        into @sql;

        SET @sql = concat ("SELECT", @sql, " from dual
        UNION ALL
        SELECT *
        FROM addstock25
        INTO OUTFILE 'E:\\JOSE DATA\\addstock7.csv'
        FIELDS TERMINATED BY ','
        ENCLOSED BY '", '"',"'
        )"
        );

        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;

J'espère que cela vous aidera.

Remarque: j'ajoute la clause WHERE TABLE_SCHEMA = 'votre nom de base de données'

1
Oscar Rovira