2009-07-13 9 views
299

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. J'ai aussi besoin de ces titres. Mon code se présente comme suitExportation de la table Postgres au fichier CSV avec en-têtes

COPY products_273 to '/tmp/products_199.csv' delimiters','; 
+0

Utilisez-vous un postgres> = 8.1? –

+0

PostgreSQL 7.3.4 – Roland

+1

Je pense que je vais faire un plan pour passer à la version plus récente, va rendre la vie beaucoup plus facile – Roland

Répondre

441
COPY products_273 TO '/tmp/products_199.csv' DELIMITER ',' CSV HEADER; 

comme décrit dans le manual.

+5

Sachez que l'argument HEADER n'a pas été introduit avant le 8.1. –

+2

Ce qui est, disons, un peu rouillé. –

+0

Thx pour la réponse fonctionnant une ancienne version 7 ;-( – Roland

30

Cela fonctionne

psql dbname -F , --no-align -c "SELECT * FROM TABLE" 
+9

Nice. Notez que cela ne semble pas échapper les virgules à l'intérieur des champs qui les contiennent. – RecursivelyIronic

+0

J'aime ça, sans le '-F,', et j'utilise '|' comme séparateur. Merci! – dsummersl

+2

Ce n'est pas ce qui est généralement considéré comme une fonctionnalité d'exportation, juste l'affichage des données contrôlées. La différence est légère, mais importante: elle est plus destinée à être lue par un humain que l'instruction 'COPY' qui crée un fichier à réutiliser –

155

ligne de commande psql:

\copy my_table to 'filename' csv header

ne point-virgule à la fin. Au lieu d'utiliser simplement le nom de la table, vous pouvez également écrire une requête pour obtenir uniquement les données de colonne sélectionnées.

+15

cette version est de loin la meilleure, car la commande 'COPY' requiert un accès admin –

+2

Aussi avec l'approche' psql', on peut sauvegarder la sortie à n'importe quel endroit où on a accès. Je viens d'utiliser l'approche 'psql' pour obtenir des données d'un serveur distant dans un fichier local. Très lisse. –

+0

Beaucoup mieux, surtout lors de l'enregistrement dans un répertoire où vous avez accès mais pas l'utilisateur postgres. –

77

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

avec privilège admin

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

Je ne crois 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

+2

lors de l'écriture s'affiche Autorisation refusée erreur – aravinth

+0

comment la syntaxe change si je copie de CSV à table pour les champs sélectionnés – user269867

1

copie (anysql de datawanttoexport de requête) à delimiter 'de fileablsoutepathwihname' '' en-tête de csv;

Vous pouvez également exporter des données.

3

Voici comment je l'ai eu shell puissance de travail en utilisant PGsl connnect à une base de données Heroku PG:

je devais d'abord changer l'encodage du client en UTF8 comme ceci: \encoding UTF8

ensuite déversée les données dans un fichier CSV déposer ceci:

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

I utilisé ~ comme délimiteur parce que je n'aime pas les fichiers CSV, je l'habitude d'utiliser des fichiers TSV, mais il ne me laisse pas ajouter « \ t » comme séparateur, donc je ~ parce que c'est un characeter rarement utilisé.

45

Lorsque je n'ai pas l'autorisation d'écrire un fichier depuis 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 
+2

Le meilleur pour "tout environnement". Meilleur pour ** 1. ** Pas besoin d'autorisations spéciales chez Postgresql ou chez le client; ** 2. ** peut utiliser un chemin relatif; et ** 3. ** est sécurisé pour le format CSV réel (devis sécurisés). –

6

Pour la version 9.5 Je l'utilise, ce serait comme ceci:

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