¿Cómo exportar tabla como CSV con encabezados en Postgresql?


418

Estoy tratando de exportar una tabla PostgreSQL con encabezados a un archivo CSV a través de la línea de comandos, sin embargo, consigo exportar a un archivo CSV, pero sin encabezados.

Mi código se ve de la siguiente manera:

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

¿Estás usando un postgres> = 8.1?
Dana the Sane

1
Creo que haré un plan para actualizar a la versión más nueva, hará la vida mucho más fácil
Elitmiar el

Respuestas:


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

como se describe en el manual .


77
Tenga en cuenta que el argumento HEADER no se introdujo hasta 8.1.
Dana the Sane

77
Lo cual es, digamos, un poco oxidado.
Milen A. Radev el

65
Nota COPYrequiere privilegios de administrador. Úselo \COPYen su lugar si tiene problemas.
fny

55
esto puede proporcionarle resultados no conformes, mejor usar "FORMAT csv" que "DELIMITER ','". sin embargo
grahamrhay

37
Para v9.5, el comando ahora esCOPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
Shubham Goyal el

223

Desde la línea de comando psql:

\COPY my_table TO 'filename' CSV HEADER

sin punto y coma al final.


22
esta versión es, con mucho, la mejor ya que el COPYcomando requiere acceso de administrador
Matthew O'Riordan

2
También con el psqlenfoque, uno puede guardar la salida en cualquier lugar al que tenga acceso. Acabo de utilizar el psqlenfoque para obtener datos de un servidor remoto en un archivo local. Muy hábil.
Ian Gow

Mucho mejor, especialmente al guardar en un directorio donde tiene acceso pero el usuario de postgres no.
Steve Bennett

2
@arilwan Use pg_dump -h remote | pg_restore -h localhost.
Ian Gow

44
@arilwan psql -c "\COPY (SELECT * FROM mytable) TO STDOUT" > mytable.csv
Juha Palomäki

122

en lugar de solo el nombre de la tabla, también puede escribir una consulta para obtener solo los datos de columna seleccionados.

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

con privilegio de administrador

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

No creo que necesite el punto y coma que termina en la versión psql del comando ( \COPY ...). Y al menos en mi versión de psql (9.5.2) no necesitaba especificar 'DELIMITER'; El valor predeterminado era una coma.
user1071847

cómo el cambio de sintaxis si estoy copiando desde CSV a la mesa para los campos seleccionados
user269867

99

Cuando no tengo permiso para escribir un archivo desde Postgres, encuentro que puedo ejecutar la consulta desde la línea de comandos.

psql -U user -d db_name -c "Copy (Select * From foo_table LIMIT 10) To STDOUT With CSV HEADER DELIMITER ',';" > foo_data.csv

77
Lo mejor para "cualquier ambiente". Lo mejor para 1. No necesita permisos especiales en Postgresql o en el cliente; 2. puede usar la ruta relativa; y 3. es seguro para el formato CSV real (cotizaciones seguras).
Peter Krauss

34

Esto funciona

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

10
Agradable. Tenga en cuenta que esto no parece escapar de las comas dentro de los campos que las contienen.
RecursivelyIronic

Me gusta esto, sin el -F ,, y lo uso |como separador. ¡Gracias!
dsummersl

2
Esto no es lo que comúnmente se considera como una función de exportación, solo visualización de datos controlada. La diferencia es ligera, pero importante: esto está más destinado a ser leído por un humano que la COPYdeclaración que crea un archivo para ser reutilizado
Romain G

77
PELIGRO no es para formato CSV, no funciona para matrices o texto con "," .. no haga una cita CSV adecuada. Usa la respuesta de @ Brian.
Peter Krauss

8

Para la versión 9.5 que uso, sería así:

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

7

Esta solución funcionó para mí usando \copy.

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

4

La forma más simple (usando psql) parece ser usando --csvflag:

psql --csv -c "SELECT * FROM products_273" > '/tmp/products_199.csv'

Eso solo funciona en PostgreSQL versión 12+
Dirk

3

He aquí cómo lo hice funcionar con Power Shell usando pgsl connnect a una base de datos Heroku PG:

Primero tuve que cambiar la codificación del cliente a utf8 así: \encoding UTF8

Luego volcó los datos a un archivo CSV esto:

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

Usé ~ como delimitador porque no me gustan los archivos CSV, por lo general uso archivos TSV, pero no me permite agregar '\ t' como delimitador, así que usé ~ porque es un carácter poco utilizado.


0

copie (anysql query datawanttoexport) a 'fileablsoutepathwihname' delimiter ',' csv header;

Usando esto, también puede exportar datos.


0

Estoy publicando esta respuesta porque ninguna de las otras respuestas dadas aquí realmente funcionó para mí. No pude usarlo COPYdesde Postgres, porque no tenía los permisos correctos. Así que elegí "Exportar filas de cuadrícula" y guardé el resultado como UTF-8.

La psqlversión dada por @Brian tampoco funcionó para mí, por una razón diferente. La razón por la que no funcionó es porque aparentemente el símbolo del sistema de Windows (estaba usando Windows) se entrometía con la codificación por sí solo. Seguí recibiendo este error:

ERROR: el carácter con la secuencia de bytes 0x81 en la codificación "WIN1252" no tiene equivalente en la codificación "UTF8"

La solución que terminé usando fue escribir un breve script JDBC (Java) que leía el archivo CSV y emitía declaraciones de inserción directamente en mi tabla de Postgres. Esto funcionó, pero el símbolo del sistema también habría funcionado si no hubiera alterado la codificación.


0

Pruebe esto: "COPIAR productos_273 DESDE '\ tmp \ products_199.csv' DELIMITER ',' CSV HEADER"

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.