Comment exporter un tableau au format CSV avec des titres sur Postgresql?

418

J'essaie d'exporter une table PostgreSQL avec des en-têtes vers un fichier CSV via la ligne de commande, mais je l'obtiens pour exporter vers un fichier CSV, mais sans en-têtes.

Mon code ressemble à ceci:

COPY products_273 to '/tmp/products_199.csv' delimiters',';
Elitmiar
la source
Utilisez-vous un postgres> = 8.1?
Dana the Sane
1
Je pense que je ferai un plan pour passer à la nouvelle version, cela rendra la vie tellement plus facile
Elitmiar
1
Voir aussi stackoverflow.com/q/1517635/287948
Peter Krauss

Réponses:

595
COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);

comme décrit dans le manuel .

Milen A. Radev
la source
7
Sachez que l'argument HEADER n'a été introduit qu'en 8.1.
Dana the Sane
7
Ce qui est, disons, un peu rouillé.
Milen A. Radev
65
Remarque COPYnécessite des privilèges d'administrateur. Utilisez-le à la \COPYplace si vous rencontrez des problèmes.
fny
5
cela peut vous donner une sortie non conforme, mieux utiliser "FORMAT csv" que "DELIMITER ','". Je ne sais pas dans quelle version cela est arrivé
grahamrhay
37
Pour la v9.5, la commande est maintenantCOPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
Shubham Goyal
223

Depuis la ligne de commande psql:

\COPY my_table TO 'filename' CSV HEADER

pas de point-virgule à la fin.

Laurent Debricon
la source
22
cette version est de loin la meilleure car la COPYcommande nécessite un accès administrateur
Matthew O'Riordan
2
Avec l' psqlapproche également, on peut enregistrer la sortie partout où l'on a accès. Je viens d'utiliser l' psqlapproche pour obtenir des données d'un serveur distant dans un fichier local. Très lisse.
Ian Gow
Beaucoup mieux, en particulier lors de l'enregistrement dans un répertoire auquel vous avez accès mais pas l'utilisateur postgres.
Steve Bennett
2
@arilwan Use pg_dump -h remote | pg_restore -h localhost.
Ian Gow
4
@arilwan psql -c "\COPY (SELECT * FROM mytable) TO STDOUT" > mytable.csv
Juha Palomäki
122

au lieu de simplement le nom de la table, vous pouvez également écrire une requête pour obtenir uniquement les données de colonne sélectionnées.

COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;

avec privilège administrateur

\COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;
Dhruvil Thaker
la source
Je ne pense pas que vous ayez besoin du point-virgule de fin dans la version psql de la commande ( \COPY ...). Et au moins dans ma version de psql (9.5.2), je n'avais pas besoin de spécifier 'DELIMITER'; la valeur par défaut était une virgule.
user1071847
comment la syntaxe change si je copie du CSV vers la table pour les champs sélectionnés
user269867
99

Lorsque je n'ai pas la permission d'écrire un fichier à partir de Postgres, je trouve que je peux exécuter la requête à partir de la ligne de commande.

psql -U user -d db_name -c "Copy (Select * From foo_table LIMIT 10) To STDOUT With CSV HEADER DELIMITER ',';" > foo_data.csv
Brian
la source
7
Le meilleur pour "n'importe quel environnement". Idéal pour 1. Pas besoin d'autorisations spéciales sur Postgresql ou sur le client; 2. peut utiliser un chemin relatif; et 3. est sécurisé pour le vrai format CSV (devis sécurisés).
Peter Krauss
34

Cela marche

psql dbname -F , --no-align -c "SELECT * FROM TABLE"
jordg
la source
10
Agréable. Notez que cela ne semble pas échapper aux virgules à l'intérieur des champs qui les contiennent.
RecursivelyIronic
J'aime ça, sans le -F ,, et l'utilise |comme séparateur. Merci!
dsummersl
2
Ce n'est pas ce qui est généralement considéré comme une fonction d'exportation, juste un affichage contrôlé des données. La différence est légère, mais importante: elle est plus destinée à être lue par un humain que la COPYdéclaration qui crée un fichier à réutiliser
Romain G
7
DANGER ce n'est pas pour le format CSV, ne fonctionne pas pour les tableaux ou le texte avec "," .. ne faites pas de citation CSV appropriée. Utilisez la réponse de @ Brian.
Peter Krauss
8

Pour la version 9.5 que j'utilise, ce serait comme ceci:

COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
maytham-ɯɐɥʇʎɐɯ
la source
7

Cette solution a fonctionné pour moi en utilisant \copy.

psql -h <host> -U <user> -d <dbname> -c "\copy <table_name> FROM '<path to csvfile/file.csv>' with (format csv,header true, delimiter ',');"
Atihska
la source
4

La manière la plus simple (d'utiliser psql) semble être d'utiliser --csvflag:

psql --csv -c "SELECT * FROM products_273" > '/tmp/products_199.csv'
Yan Foto
la source
Cela ne fonctionne que dans la version 12+ de PostgreSQL
Dirk
3

Voici comment je l'ai fait fonctionner Power Shell en utilisant pgsl connnect à une base de données Heroku PG:

J'ai d'abord dû changer l'encodage client en utf8 comme ceci: \encoding UTF8

Ensuite, les données ont été transférées dans un fichier CSV:

\copy (SELECT * FROM my_table) TO  C://wamp64/www/spider/chebi2/dump.csv CSV DELIMITER '~'

J'ai utilisé ~ comme délimiteur parce que je n'aime pas les fichiers CSV, j'utilise généralement des fichiers TSV, mais cela ne me laisse pas ajouter '\ t' comme délimiteur, j'ai donc utilisé ~ parce que c'est un caractère rarement utilisé.

Cheval O'Houlihan
la source
0

copier (les données de requête anysqwanttoexport) vers 'fileablsoutepathwihname' delimiter ',' en-tête csv;

L'utilisation de ce u peut également exporter des données.

user3767321
la source
0

Je poste cette réponse car aucune des autres réponses données ici n'a vraiment fonctionné pour moi. Je ne pouvais pas utiliserCOPY depuis Postgres, car je n'avais pas les bonnes autorisations. J'ai donc choisi "Exporter les lignes de la grille" et enregistré la sortie au format UTF-8.

La psqlversion donnée par @Brian ne fonctionnait pas non plus pour moi, pour une raison différente. La raison pour laquelle cela n'a pas fonctionné est que, apparemment, l'invite de commande Windows (j'utilisais Windows) se mêlait de l'encodage par elle-même. J'ai continué à recevoir cette erreur:

ERREUR: le caractère avec la séquence d'octets 0x81 dans le codage "WIN1252" n'a pas d'équivalent dans le codage "UTF8"

La solution que j'ai finalement utilisée était d'écrire un court script JDBC (Java) qui lisait le fichier CSV et émettait des instructions d'insertion directement dans ma table Postgres. Cela a fonctionné, mais l'invite de commande aurait également fonctionné si elle n'avait pas modifié l'encodage.

Tim Biegeleisen
la source
0

Essayez ceci: "COPY products_273 FROM '\ tmp \ products_199.csv' DELIMITER ',' CSV HEADER"

Mohit Singh
la source